35.8. pty — 伪终端实用程序 — Python 文档

来自菜鸟教程
Python/docs/3.6/library/pty /
机器人讨论 | 贡献2021年10月31日 (日) 04:38的版本 (Page commit)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至:导航、​搜索

35.8. 私人有限公司 — 伪终端实用程序

源代码: :source:`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() 返回状态值。

35.8.1. 例子

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

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)