使用Python 3,我想执行一个外部程序,通过向标准输入提供一些文本与之交互,然后打印结果。
作为一个例子,我创建了以下外部程序,名为 test.py
:
print('Test Program')
print('1 First option, 2 Second Option')
choice = input()
if choice == '1':
second_param = input('Insert second param: ')
result = choice + ' ' + second_param
print(result)
如果我直接运行这个程序,它就会像预期的那样工作。如果我提供输入 1
然后 2
,结果是 1 2
.
我想在另一个脚本中运行这个程序,并与它交互打印同样的结果。
在阅读了 subprocess
,并在SO上查看了类似的问题,最后我得到了以下的结果。
EXTERNAL_PROG = 'test.py'
p = Popen(['py', EXTERNAL_PROG], stdout=PIPE, stdin=PIPE, shell=True)
print(p.stdout.readline().decode('utf-8'))
print(p.stdout.readline().decode('utf-8'))
p.stdin.write(b'1\n')
p.stdin.write(b'2\n')
print(p.stdout.readline().decode('utf-8'))
但是,当我运行这段代码时,程序在打印之后就冻结了 1 First option, 2 Second Option
我需要重新启动我的shell。我相信这可能是由以下原因造成的。subprocess.stdout.readline()
期望找到一个换行符,而第二个param的提示不包含换行符。
我找到了2个SE问题,说的都是类似的事情,但是我无法让它工作。
下面是答复中建议使用 pexpect
模块。我试着根据我的情况调整代码,但我不知道如何让它工作。
下面是建议使用 -u
但添加它并没有任何改变。
我知道,也许可以通过修改 test.py
但在我的情况下,这是不可能的,因为我需要使用另一个外部程序,这只是一个基于它的最小的例子。
如果你的程序有固定的输入 (意思是在运行时输入不改变),那么这个解决方案可以适用。
首先创建文件。
1 2
其中
command = "python test.py < input.txt > output.txt 2>&1"
# now run this command
os.system(command)
当你运行这个时,你会发现 output.txt
在同一目录下。如果您的程序执行成功,那么 output.txt
包含代码输出 test.py
但如果你的代码出现任何错误,那么错误就出现在 output.txt
.
main.py
成为
import sys
from subprocess import PIPE, Popen
EXTERNAL_PROG = 'test.py'
p = Popen(['python3', EXTERNAL_PROG], stdout=PIPE, stdin=PIPE, stderr=PIPE)
print(p.stdout.readline())
print(p.stdout.readline())
p.stdin.write(b'1\n')
p.stdin.write(b'2\n')
p.stdin.flush()
print(p.stdout.readline())
print(p.stdout.readline())
如果你得到了你的答案,请接受这个答案。