在Windows上使用Python的subprocess.communicate()时遇到问题
我有一个应用程序,想通过Python和subprocess模块来控制它。简单来说,我是用Popen来启动这个应用程序的,这样就会打开一个命令提示符,程序就在里面运行。然后在执行的某个时刻,我需要把一个字符串(也就是一个命令)发送到这个程序的标准输入(STDIN)。这个过程基本上是没问题的,但有个麻烦就是,命令在我手动在应用程序的命令窗口里按下一个键之前,是不会被处理的。以下是我代码的一部分:
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
尝试:
cmd = 'quit\n\r'
编辑:
对我来说,唯一有效的方法是:
app = subprocess.Popen(["cmd.exe","testparam"],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
app.stdin.write('exit\r\n')
因为正如文档所说:
Popen.communicate(input=None)
与进程互动:向标准输入(stdin)发送数据。从标准输出(stdout)和标准错误(stderr)读取数据,直到文件结束。等待进程结束。可选的输入参数应该是一个字符串,用于发送给子进程,如果不需要发送数据给子进程,则可以是None。