问题在Windows上使用Python的subprocess.communicate()

时间:2009-10-28 16:29:55

标签: python subprocess

我有一个应用程序,我试图通过Python和子进程模块控制。基本上我所做的是使用Popen启动应用程序(打开程序执行的命令提示符)然后在执行的某个时间点我需要向该程序的STDIN发送一个字符串(命令) 。这工作正常,除非我手动在Python已启动的应用程序的命令窗口中键入一个按钮之前不会处理该命令。这是我的代码的一部分:

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')

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

1 个答案:

答案 0 :(得分: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(输入=无)

     

与流程交互:将数据发送到   标准输入。从stdout和。读取数据   stderr,直到达到文件结尾。   等待进程终止。该   可选的输入参数应该是a   要发送给孩子的字符串   进程,或无,如果没有数据   寄给孩子。