我是子流程模块的新手,在阅读了许多其他网站(包括Stack Overflow)中的Python documents后,我很难找到.Popen
,.communicate
的简化示例,和其他这样有用的类。通常情况下,这些例子不会连续使用每个类,只能依靠自己。此外,许多示例都是基于Linux的,例如使用["ls", "-l"]
,这使得Windows用户很难理解。
使用此模块几个小时后,我遇到了几个问题,可以通过打开和与简单的.exe命令行程序进行通信的方法来最好地说明。
例如,假设程序名为“numbers.exe”,并询问以下问题:
>>> Question 1) Choose 1, 2 or 3
>>> Question 2) Choose 4, 5 or 6
>>> You have answered #(Q1) and #(Q2)
>>> *Use these values in an iterative sequence displaying each stage in the iteration*
然后我想自动操作这个程序,即我想让python输入2和6而不需要做任何事情,但仍然打印问题。然后我希望能够在python中查看迭代。
这里首先考虑的是我可以使用:
from subprocess import Popen, PIPE
numprog = subprocess.call('numbers.exe')
print(numprog.communicate())
然而,这只是打开程序,我仍然需要自己输入2和6。为了使过程自动化,我相信我必须使用Popen
,以及stdin,stdout和stderr。这是我遇到问题的地方。我明白我必须使用Popen开始与输入(stdin),输出(stdout)和错误(stderr)管道进行通信:
from subprocess import Popen, PIPE
numcomms = Popen('numbers.exe', stdout=PIPE, stdin=PIPE, stderr=PIPE)
我不确定该怎么做。使用numcomms.stdout.read()
会导致程序停顿,并且使用numcomms.stdin.write(2)
会抛出无法使用int值的错误。 numprog.communicate
类似乎要求您自己输入值。
从我所看到的,伪代码将是这样的:
>>> Open numbers.exe stdin, stdout and stderr pipes using Popen
>>> Print first question using stdout
>>> Enter "2" using stdin
>>> Print second question using stdout
>>> Enter "6" using stdin
>>> Receive a string saying "You have answered 2 and 6" using stdout
>>> Display the results of each stage of the iteration using stdout
我将如何写这篇文章?
非常感谢帮助,谢谢!
编辑:编辑问题以描述迭代序列问题。迈克尔建议对输入问题有一个很好的解决方案,但是我无法打印迭代结果。
答案 0 :(得分:3)
subprocess.stdin.write
的问题可能是你需要提供一个字符串而不是整数,正如Steve Barnes所指出的那样。
但是,对于您的简单案例,他们可能是一个更容易的解决方案。 communicate
方法有一个输入的可选参数,所以这应该有效:
from subprocess import Popen, PIPE
numcomms = Popen('numbers.exe', stdout=PIPE, stdin=PIPE, stderr=PIPE)
out, err = numcomms.communicate("2\n6\n")
之后程序的输出应该在out
,并且可以使用out.splitlines()
轻松拆分。
答案 1 :(得分:1)
我认为你对subprocess.stdin.write的问题是程序会期望一个字符串可能以换行符终止,即'2 \ n'而不是int。