Python中的伪终端实用程序

2025年1月5日 | 阅读 4 分钟

Python 伪终端实用工具简介

类似于 Unix 的操作系统具有伪终端(或 PTY)的功能,它允许应用程序模拟真实终端的行为。这对于构建基于终端的应用程序、自动化任务和执行交互式命令行程序等非常有用。

您可以使用 Python 的多种伪终端交互方法以编程方式创建、管理和与终端会话进行通信。在本文中,我们将探讨可用于使用伪终端的各种 Python 工具和包。

1. pty 模块

Python 的 pty 模块提供了一个用于与伪终端交互的简单接口。它使您能够控制新创建的、连接到伪终端的句柄的输入和输出,以及捕获其输出。

代码

输出

username@computer:~/directory$ ls
file1.txt
file2.txt
script.py
username@computer:~/directory$ pwd
/home/username/directory
username@computer:~/directory$ echo "Hello, world!"
Hello, world!
username@computer:~/directory$

说明

代码将一直等待用户输入。一旦用户输入命令并按 Enter 键,它将执行该命令并显示输出。它将一直这样做,直到用户退出会话。它有效地复制了终端的行为,允许您通过 Python 与 shell 进程进行交互。

2. pexpect 库

pexpect 是一个 Python 包,用于管理交互式 CLI 应用程序。它通过在 pty 模块的基础上进行扩展,提供了更强大、更灵活的 API 来与终端应用程序通信。

代码

输出

total 0
-rw-r--r-- 1 user user 0 May 13 11:36 file1.txt
-rw-r--r-- 1 user user 0 May 13 11:36 file2.txt
-rw-r--r-- 1 user user 0 May 13 11:36 script.py

说明

  • pexpect.spawn('bash') 命令会生成一个现代 shell 进程。
  • expect('bash-5.0$') 等待 shell 提示符。
  • sendline('ls -l') 发送 ls -l 命令以长格式列出文件。
  • expect('bash-5.0$') 在命令执行后等待提示符。
  • print(child.before.decode()) 打印命令的输出。
  • 最后,child.sendline('exit') 发送 exit 命令以退出 shell。
  • wait() 等待子进程终止。

3. ptyprocess 库

ptyprocess 是另一个提供与伪终端交互的高级接口的库。它简化了生成和交互式处理终端进程的过程。

代码

输出

total 8
-rw-r--r-- 1 user user 0 May 13 11:36 file1.txt
-rw-r--r-- 1 user user 0 May 16 11:36 file2.txt
-rw-r--r-- 1 user user 0 May 16 11:36 script.py

说明

  • PtyProcess.spawn(['bash']) 启动一个新的 shell 进程。
  • write(b'ls -ln') 将 ls -l 命令后面加上换行符写入该方法。
  • output = process.read().decode() 读取命令的输出。
  • print(output) 打印输出。
  • write(b'exit\n') 写入 exit 命令后面加上换行符以退出 shell。
  • wait() 等待进程终止。

4. 具有 pty 支持的 subprocess 模块

Python 的 subprocess 模块主要用于启动和管理子进程,当与 pty 模块结合使用时,也支持伪终端功能。它使得能够为具有伪终端的子进程进行计划,从而促进与子进程的更复杂的交互。

代码

输出

username@computer:~/directory$ ls
file1.txt
file2.txt
script.py
username@computer:~/directory$ pwd
/home/username/directory
username@computer:~/directory$ echo "Hello, world!"
Hello, world!
username@computer:~/directory$

说明

  • openpty() 打开一个伪终端并返回一对文件描述符(主文件描述符,从文件描述符)。
  • Popen(['bash'], stdin=slave, stdout=slave, stderr=slave) 使用 Bash 作为 shell 启动一个子进程,并将其标准输入、输出和错误连接到伪终端。
  • while 循环从主文件描述符(master)读取并写入,就好像在与终端交互一样。它打印来自子进程的输出,并等待用户输入以发送到子进程。
  • close(master) 和 os.close(slave) 关闭伪终端的文件描述符。
  • wait() 等待子进程完成。

结论

总之,Python 提供了广泛的伪终端工具,使开发人员能够轻松地创建基于终端的应用程序、自动化操作和与命令行程序进行交互。Python 的库涵盖了所有级别的复杂性和需求,从基本的 'pty' 模块到更现代的 'pexpect' 和 'ptyprocess'。通过 Python 的伪终端工具,可以轻松地将终端功能集成到您的 Python 程序中,满足各种需求,无论是复杂的控制、简单的交互还是轻量级的解决方案。这些工具简化了伪终端的使用,使程序员能够编写健壮、交互式且高效的自动化脚本和命令行界面。