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

如何在Python3中与外部程序交互?,python,python-3.x,subprocess,Python,Python 3.x,Subprocess,使用Python3,我想执行一个外部程序,通过在标准输入中提供一些文本与之交互,然后打印结果 例如,我创建了以下外部程序,名为test.py: print('测试程序') 打印(“1个第一选项,2个第二选项”) 选择=输入() 如果选项==“1”: 第二个参数=输入('插入第二个参数:') 结果=选项+“”+第二个参数 打印(结果) 如果我直接运行这个程序,它会按预期工作。如果我先输入1,然后输入2,结果是12 我想在另一个脚本中运行这个程序,并与之交互以打印相同的结果 在阅读了文档并检查了类

使用Python3,我想执行一个外部程序,通过在标准输入中提供一些文本与之交互,然后打印结果

例如,我创建了以下外部程序,名为
test.py

print('测试程序')
打印(“1个第一选项,2个第二选项”)
选择=输入()
如果选项==“1”:
第二个参数=输入('插入第二个参数:')
结果=选项+“”+第二个参数
打印(结果)
如果我直接运行这个程序,它会按预期工作。如果我先输入
1
,然后输入
2
,结果是
12

我想在另一个脚本中运行这个程序,并与之交互以打印相同的结果

在阅读了文档并检查了类似的问题之后,我得出以下结论:

EXTERNAL_PROG='test.py'
p=Popen(['py',外部程序],标准输出=管道,标准输入=管道,外壳=真)
打印(p.stdout.readline().decode('utf-8'))
打印(p.stdout.readline().decode('utf-8'))
p、 stdin.write(b'1\n')
p、 stdin.write(b'2\n')
打印(p.stdout.readline().decode('utf-8'))
但是,当我运行代码时,程序在打印
1第一选项、2第二选项后冻结,我需要重新启动shell。这可能是因为
subprocess.stdout.readline()
希望找到换行符,而第二个参数的提示不包含换行符


我发现有两个问题是关于类似的东西,但我没能让它起作用

,答案建议使用该模块。我试图使代码适应我的情况,但没有成功

,建议使用
-u
,但添加它并没有改变任何事情



我知道可以通过修改
test.py
找到解决方案,但在我的情况下,这是不可能的,因为我需要使用另一个外部程序,这只是基于它的一个最小示例。

如果您的程序有固定的输入(意味着在运行时输入不改变),那么这个解决方案可能是相关的

答复 首先创建文件

  • 输入文件。将其命名为input.txt并将
    12
    放入其中

command=“python test.pyoutput.txt 2>&1”
#现在运行这个命令
操作系统(命令)
运行此命令时,您将在同一目录中找到
output.txt
。如果程序成功执行,则
output.txt
包含代码
test.py
的输出,但如果代码出现任何错误,则错误在
output.txt

随你怎么回答
main.py
been

导入系统 从子流程导入管道,Popen 外部程序='test.py' p=Popen(['python3',外部程序],标准输出=管道,标准输入=管道,标准输出=管道) 打印(p.stdout.readline()) 打印(p.stdout.readline()) p、 stdin.write(b'1\n') p、 stdin.write(b'2\n') p、 stdin.flush() 打印(p.stdout.readline()) 打印(p.stdout.readline())
尝试将
p.stdin.readline()
命令更改为
p.stdin.read()
。您甚至可能希望将其放入一个循环中,如
while(print(p.stdin.read()):next
,以确保需要读取的内容都被读取。不确定这是否是问题所在,但它将测试您关于readline()功能的理论。如果我在
input.txt
中有
1\n2
,则此功能有效。如果输入是固定的,这是一个很好的解决方案。是的,这是因为你的程序分别读取2个整数。您的输入文件包含的数据与您通过控制台提供给程序的数据相同。如果你得到了预期的结果,请接受答案。这个答案唯一的问题是我不想把我的输入保存在文件中。我想通过程序本身传递它。假设我有
firstParam=1
,和
secondParam=2
。如果您的输入是静态的(不更改运行时),是否有方法将其用作输入,而不是从
input.txt
读取然后您可以将其写入文件,然后运行上面的代码,但如果您的输入正在更改,那么它就没有任何用处。因此,假设我将
firstParam
secondParam
作为变量,并且我已经计算了它们的值。我可以将它们的值保存到文件中,运行代码,然后删除该文件。但是,有没有更好的方法可以做到这一点,也许可以使用不同的
命令