从python脚本运行程序时,了解python中的子进程模块

时间:2016-02-15 18:34:11

标签: python subprocess

我通常通过键入./run file_name从我的OpenSuse linux终端运行程序。这将显示一系列选项,我可以通过键入数值0-9并在键盘上点击返回来选择。现在我想自动从python脚本中执行此操作。我的下面示例不起作用,但我无法理解我失败的地方以及如何调试:

import subprocess
p = subprocess.Popen(["/path/to/program/run", file_name], stdin = subprocess.PIPE,stdout=subprocess.PIPE,shell=False)
print "Hello"
out, err = p.communicate(input='0\r\n')
print out
print err
for line in p.stdout.readlines():
    print line

这个程序的输出只是

>> Hello
>>

即。然后它似乎冻结了(我不知道它究竟发生了什么!)我希望看到我在运行./run file_name时看到的内容  然后直接在我的终端点击0然后return,但我向你保证情况并非如此。 我该怎么做来调试我的代码?

编辑1:正如评论

中所建议的那样
import subprocess

fileName = 'test_profile'
p = subprocess.Popen(["/path/to/program/run", fileName], stdin = subprocess.PIPE,stdout=subprocess.PIPE,shell=False)
print "Hello"

for line in iter(p.stdout.readline,""):
    print line

确实会返回我程序的标准输出!

1 个答案:

答案 0 :(得分:1)

communicate等待程序完成。例如:

import subprocess
p = subprocess.Popen(["cut", "-c2"], stdin=subprocess.PIPE, stdout=subprocess.PIPE,shell=False)
out, err = p.communicate(input='abc')
print("Result: '{}'".format(out.strip()))

# Result: 'b'

听起来你有一个更具互动性的剧本,在这种情况下你可能应该尝试pexpect

import pexpect

child = pexpect.spawn('cut -c2')
child.sendline('abc')
child.readline() # repeat what was typed
print(child.readline()) # prints 'b'