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

问题描述 投票:0回答:1

使用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但在我的情况下,这是不可能的,因为我需要使用另一个外部程序,这只是一个基于它的最小的例子。

python python-3.x subprocess
1个回答
1
投票

如果你的程序有固定的输入 (意思是在运行时输入不改变),那么这个解决方案可以适用。

首先创建文件。

  • 将其命名为input.txt,并在文件中放入 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())

如果你得到了你的答案,请接受这个答案。

© www.soinside.com 2019 - 2024. All rights reserved.