使用subprocess和.Popen自动执行.exe程序的简单Windows示例

时间:2013-07-14 17:59:09

标签: python subprocess stdout stdin stderr

我是子流程模块的新手,在阅读了许多其他网站(包括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

我将如何写这篇文章?

非常感谢帮助,谢谢!

编辑:编辑问题以描述迭代序列问题。迈克尔建议对输入问题有一个很好的解决方案,但是我无法打印迭代结果。

2 个答案:

答案 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。