使用Python pty伪终端发送命令并退出

4 投票
1 回答
5236 浏览
提问于 2025-04-17 09:26

我想用Python的pty模块向终端模拟器发送一些命令,使用一个函数作为标准输入(因为pty模块需要这样),然后强制退出。我想到了类似这样的做法:

import pty
cmnds = ['exit\n', 'ls -al\n']
# Command to send. I try exiting as last command, but it doesn't works.

def r(fd):
    if cmnds:
        cmnds.pop()
        # It seems is not executing sent commands ('ls -al\n')
    else:
        # Can i quit here? Can i return EOF?
        pass

pty.spawn('/bin/sh', r)

谢谢

1 个回答

2

首先,pty模块并不能让你和Python运行的终端模拟器直接交流。相反,它的作用是让Python假装成一个终端模拟器。

pty.spawn()的源代码来看,它的设计目的是让一个新启动的进程接管Python的输入和输出,这并不是你想要的效果。

如果你只是想启动一个命令行,发送命令给它,并读取输出,那么你可能需要使用Python的subprocess模块。特别是如果你只想运行一个命令,subprocess.Popen类的.communicate()方法会很有帮助。

如果你确实需要子进程在一个伪终端(pty)中运行,而不是通过管道,你可以使用os.openpty()来分配一个主文件描述符和一个从文件描述符。然后把从文件描述符当作子进程的输入和输出,接着把命令写入主文件描述符,并从中读取响应。

撰写回答