pty– 伪终端实用程序

源代码: Lib / pty.py


pty模块定义了处理伪终端概念的操作:启动另一个进程并能够以编程方式写入和读取其控制终端.

因为伪终端处理高度依赖于平台,所以只有Linux代码才有。(Linux代码应该可以在其他平台上运行,但尚未经过测试。)

pty模块定义了以下功能:

pty.fork
叉子。将孩子的控制终端连接到伪终端。返回值是(pid, fd)。请注意,孩子得到pid 0,而fdinvalid。父项的返回值是孩子的pid,而fd是连接到孩子控制终端的文件描述符(也是孩子的标准输入和输出).
pty.openpty
使用os.openpty()如果可能的话,通用Unix系统的模拟代码。对于主端和从端分别返回一对文件描述符(master, slave) .
pty.spawn (argv [, master_read [, stdin_read] ]
生成一个进程,并将其控制终端与当前进程的标准io连接。这通常用于阻止从控制终端读取的程序.

函数master_readstdin_read应该是从文件描述符读取的函数。默认情况下每次调用时都会尝试读取1024个字节.

在版本3.4中更改:spawn()现在返回子进程的os.waitpid()的状态值.

示例

以下程序的行为类似于Unix命令script(1),使用apseudo-terminal在“打字稿”中记录终端会话的所有输入和输出.

import argparse
import os
import pty
import sys
import time

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.executable if options.use_python else os.environ.get('SHELL', 'sh')
filename = options.filename
mode = 'ab' if options.append else 'wb'

with open(filename, mode) as script:
    def read(fd):
        data = os.read(fd, 1024)
        script.write(data)
        return data

    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)