如何在Python 3中与外部程序进行交互?
如何在Python 3中与外部程序进行交互?
使用Python 3,我想要执行一个外部程序,并通过提供一些文本到标准输入与其交互,然后打印结果。
举个例子,我创建了下面的外部程序,名为test.py
:
print('测试程序') print('1 第一个选项, 2 第二个选项') choice = input() if choice == '1': second_param = input('插入第二个参数:') 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 第一个选项, 2 第二个选项
后冻结住了,我需要重新启动我的shell。这可能是因为subprocess.stdout.readline()
期望找到一个换行符,而第二个参数的提示信息中没有换行符导致的。
我找到了两个关于类似问题的SO问题,但我无法使其工作。
在这里,答案建议使用pexpect
模块。我尝试将代码调整为适应我的情况,但没有成功。
在这里,建议使用-u
,但添加它并没有改变任何事情。
我知道可以通过修改test.py
来找到解决方案,但在我的情况下这是不可能的,因为我需要使用另一个外部程序,而这只是基于它的一个最小示例。