python中的交互式shell程序包装器

时间:2016-05-20 07:29:26

标签: python linux python-2.7 shell

我试图通过python运行shell程序。我需要运行一个命令,然后当它仍在运行并等待输入继续时,我需要获取程序接收的输出,并将该数据作为字符串处理。然后我需要将一些数据解析到该程序中,并模拟输入按下。 实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

使用subprocess.Popen运行您的shell应用程序并使用communicate与其进行交互。

答案 1 :(得分:0)

subprocess.Popen可以为此工作,但要阅读然后再写,然后再次阅读,您就无法使用communicate(因为这会导致流程结束)。

相反,您需要使用流程的输出管道(process.stdout下方)。这样做是很棘手的,因为阅读过程的stdoutblocking,所以你需要知道何时停止尝试阅读(或知道这个过程有多少输出)要生产)。

在这个例子中,子进程是一个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的内容。