2009-10-28 78 views
0

我有一个应用程序,我试图通过Python和子流程模块进行控制。本质上,我所做的是使用Popen(打开命令提示符在其中执行程序)启动应用程序,然后在某个时间点执行后,我需要向该程序的STDIN发送一个字符串(一条命令) 。除了在我手动在Python启动的应用程序的命令窗口中输入一个按钮之前,该命令没有得到处理这一事实之外,这很好。这里是我的代码的一部分:问题在Windows上使用Python的subprocess.communicate()

cmd = 'quit\n' 
app.communicate(cmd.encode('utf-8')) 

任何想法?

编辑#1

是键入一个按钮是否意味着按键盘,遗憾的混乱上的按键。我已经附加更多的我的代码如下

app = Popen(['runProg.exe', '-m', '20'], stdin=PIPE, universal_newlines=True) 
while not os.path.exists('C:/temp/quit-app.tmp'): time.sleep(1) 
app.communicate('quit') 
os.remove('C:/temp/quit-app.tmp') 

那么会发生什么是程序要运行,直到创建戒烟app.tmp文件;一旦创建“退出”应该发送到应用程序,这是一个干净关闭的命令。如果一个人在运行这个程序,他们只需在命令窗口中输入“quit”即可。谢谢!

+0

你能否确认通过“输入按钮”,你的意思是按下一个键(键盘) - 我想是这样,但只是为了避免混淆。这是一个正常的控制台应用程序吗?你的Popen电话是什么样的?也许再多贴一点你的代码,就没有太多的工作要做。 – RedGlyph 2009-10-28 17:54:21

回答

0

尝试:

cmd = 'quit\n\r' 

编辑:

只有为我工作的事情是:

app = subprocess.Popen(["cmd.exe","testparam"],stdout=subprocess.PIPE,stdin=subprocess.PIPE) 
app.stdin.write('exit\r\n') 

因为随着documentation说:

Popen.communicate(输入=无)

与进程进行互动:将数据发送到 stdin。从stdout和 stderr中读取数据,直到达到文件结束。 等待进程终止。 可选的输入参数应该是 字符串发送给子 过程,或者无,如果没有数据应发送到 子。

+0

好吧,我只是试过,我仍然有同样的问题。虽然谢谢! – Bozzy 2009-10-28 16:36:21

+0

理论上它是'\ r \ n'而不是'\ n \ r',不知道这对您的应用程序是否有所帮助。为了避免变换字符串,可以在调用Popen时将可选'universal_newlines'参数设置为True。通常在Windows上,管道是以二进制模式打开的,事实上,如果你不使用这个选项,你必须按照bua的建议来做(显然还有其他的东西)。因此,无论您的问题如何,请使用此选项或添加“\ r \ n”。 – RedGlyph 2009-10-28 17:47:17

+0

请查看最后更新。 – bua 2009-10-29 07:54:49