Python标准库pty伪终端工具
源代码: Lib/pty.py
pty
模块定义了一些处理“伪终端”概念的操作:启动另一个进程并能以程序方式在其控制终端中进行读写。
由于伪终端处理高度依赖于具体平台,因此此功能只有针对 Linux 的代码。 (Linux 代码也可在其他平台上工作,但是未经测试。)
pty
模块定义了下列函数:
pty.
fork
()¶分叉。 将子进程的控制终端连接到一个伪终端。 返回值为
(pid,fd)
。 请注意子进程获得 pid 0 而 fd 为 invalid。 父进程返回值为子进程的 pid 而 fd 为一个连接到子进程的控制终端(并同时连接到子进程的标准输入和输出)的文件描述符。
pty.
openpty
()¶打开一个新的伪终端对,如果可能将使用
os.openpty()
,或是针对通用 Unix 系统的模拟代码。 返回一个文件描述符对(master,slave)
,分别表示主从两端。
pty.
spawn
(argv[, master_read[, stdin_read]])¶生成一个进程,并将其控制终端连接到当前进程的标准 io。 这常被用来应对坚持要从控制终端读取数据的程序。 在 pty 背后生成的进程预期最后将被终止,而且当它被终止时 spawn 将会返回。
会向 master_read 和 stdin_read 函数传入一个文件描述符供它们读取,并且它们总是应当返回一个字节串。 为了强制生成在子进程退出之前返回所以应当抛出
OSError
。两个函数的默认实现在每次函数被调用时将读取并返回至多 1024 个字节。 会向 master_read 回调传入伪终端的主文件描述符以从子进程读取输出,而向 stdin_read 传入文件描述符 0 以从父进程的标准输入读取数据。
从两个回调返回空字节串会被解读为文件结束 (EOF) 条件,在此之后回调将不再被调用。 如果 stdin_read 发出 EOF 信号则控制终端就不能再与父进程或子进程进行通信。 除非子进程将不带任何输入就退出,否则随后 spawn 将一直循环下去。 如果 master_read 发出 EOF 信号则会有相同的行为结果(至少是在 Linux 上)。
如果两个回调都发出 EOF 信号则 spawn 可能将永不返回,除非在你的平台上当传入三个空列表时 select 会抛出一个错误。 这是一个程序缺陷,相关文档见 问题 26228。
在 3.4 版更改:
spawn()
现在会从子进程的os.waitpid()
返回状态值。
示例¶
以下程序的作用类似于 Unix 命令 script(1),它使用一个伪终端来记录一个 "typescript" 里终端进程的所有输入和输出:
importargparseimportos
importpty
importsys
importtime
parser=argparse.ArgumentParser()
parser.add_argument('-a',dest='append',action='store_true')
parser.add_argument('-p',dest='use_python',action='store_true')
parser.add_argument('filename',nargs='?',default='typescript')
options=parser.parse_args()
shell=sys.executableifoptions.use_pythonelseos.environ.get('SHELL','sh')
filename=options.filename
mode='ab'ifoptions.appendelse'wb'
withopen(filename,mode)asscript:
defread(fd):
data=os.read(fd,1024)
script.write(data)
returndata
print('Script started, file is',filename)
script.write(('Script started on %s\n'%time.asctime()).encode())
pty.spawn(shell,read)
script.write(('Script done on %s\n'%time.asctime()).encode())
print('Script done, file is',filename)
以上是 Python标准库pty伪终端工具 的全部内容, 来源链接: utcz.com/z/507785.html