【发布时间】:2020-05-22 13:38:01
【问题描述】:
使用 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() 期望找到一个换行符,而第二个参数的提示符不包含一个。
我发现 2 个 SO 问题讨论了类似的问题,但我无法让它发挥作用。
Here,答案推荐使用pexpect模块。我尝试使代码适应我的情况,但没有奏效。
Here,建议使用-u,但添加并没有改变。
我知道可以通过修改test.py 找到解决方案,但在我的情况下这是不可能的,因为我需要使用另一个外部程序,这只是一个基于它的最小示例。
【问题讨论】:
-
尝试将
p.stdin.readline()命令更改为p.stdin.read()。你甚至可能想把它放在一个循环中,比如while (print(p.stdin.read())): next,以确保任何需要阅读的东西都能被阅读。不确定这是否是问题所在,但它将测试您关于 readline() 功能的理论。
标签: python python-3.x subprocess