如何在Python3中与外部程序交互?
使用Python3,我想执行一个外部程序,通过在标准输入中提供一些文本与之交互,然后打印结果 例如,我创建了以下外部程序,名为如何在Python3中与外部程序交互?,python,python-3.x,subprocess,Python,Python 3.x,Subprocess,使用Python3,我想执行一个外部程序,通过在标准输入中提供一些文本与之交互,然后打印结果 例如,我创建了以下外部程序,名为test.py: print('测试程序') 打印(“1个第一选项,2个第二选项”) 选择=输入() 如果选项==“1”: 第二个参数=输入('插入第二个参数:') 结果=选项+“”+第二个参数 打印(结果) 如果我直接运行这个程序,它会按预期工作。如果我先输入1,然后输入2,结果是12 我想在另一个脚本中运行这个程序,并与之交互以打印相同的结果 在阅读了文档并检查了类
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
作为变量,并且我已经计算了它们的值。我可以将它们的值保存到文件中,运行代码,然后删除该文件。但是,有没有更好的方法可以做到这一点,也许可以使用不同的命令?