【发布时间】:2016-09-17 08:35:05
【问题描述】:
我正在尝试通过 python 运行一个 shell 程序。我需要运行一个命令,然后当它仍在运行并等待输入继续时,我需要获取程序接收到的输出,并将该数据作为字符串处理。然后我需要将一些数据解析到该程序中,并模拟输入。 实现这一目标的最佳方法是什么?
【问题讨论】:
标签: python linux python-2.7 shell
我正在尝试通过 python 运行一个 shell 程序。我需要运行一个命令,然后当它仍在运行并等待输入继续时,我需要获取程序接收到的输出,并将该数据作为字符串处理。然后我需要将一些数据解析到该程序中,并模拟输入。 实现这一目标的最佳方法是什么?
【问题讨论】:
标签: python linux python-2.7 shell
subprocess.Popen 可以解决这个问题,但是读取然后写入然后再读取你不能使用communicate(因为这会导致进程结束)。
相反,您需要使用进程的输出管道(下面的process.stdout)。这很难做到正确,因为读取进程的stdout 是blocking,所以你需要知道何时停止尝试读取(或知道进程将产生多少输出)。
在这个例子中,子进程是一个 shell 脚本,它写入一行输出,然后回显你给它的任何内容,直到它读取 EOF。
import subprocess
COMMAND_LINE = 'echo "Hello World!" ; cat'
process = subprocess.Popen(COMMAND_LINE, shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
s = process.stdout.readline().strip()
print(s)
s2 = process.communicate(s)[0]
print(s2)
给予:
Hello World!
Hello World!
对于更复杂的情况,您可能会考虑查看 pexpect 之类的内容。
【讨论】:
使用subprocess.Popen 运行您的shell 应用程序并使用communicate 与之交互。
【讨论】: