如何在Python 3中与外部程序进行交互?

14 浏览
0 Comments

如何在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来找到解决方案,但在我的情况下这是不可能的,因为我需要使用另一个外部程序,而这只是基于它的一个最小示例。

0