我使用Python执行外部程序。 而且我也想Python的一些击键发送到调用的程序来完成自动登录。
问题是,当我用subprocess.call()来执行外部程序,该程序通过了体系的重点和Python脚本无法回应,直到我关闭了外部程序。
难道你们对此有什么建议吗? 非常感谢。
我使用Python执行外部程序。 而且我也想Python的一些击键发送到调用的程序来完成自动登录。
问题是,当我用subprocess.call()来执行外部程序,该程序通过了体系的重点和Python脚本无法回应,直到我关闭了外部程序。
难道你们对此有什么建议吗? 非常感谢。
使用subprocess.Popen()
代替.call()
随着Popen
还可以控制标准输入 , 输出和错误文件描述符,所以你也许可以与外部程序进行交互。
傻例如:
s = subprocess.Popen(command, stdout=subprocess.PIPE,
stderr=subprocess.PIPE) # The script is not blocked here
# Wait to finish
while s.poll() is None: # poll() checks if process has finished without blocking
time.sleep(1)
... # do something
# Another way to wait
s.wait() # This is blocking
if s.returncode == 0:
print "Everything OK!"
else:
print "Oh, it was an error"
一些有用的方法:
Popen.poll()检查子进程已经终止。 设置并返回返回码属性。
Popen.wait()等待子进程终止。 设置并返回返回码属性。
Popen.communicate(输入=无)与进程交互:发送数据到标准输入。 阅读从stdout和stderr数据,达到-的文件结束到。 等待进程终止。 可选的输入参数应该是一个字符串发送给子进程,或无,如果没有数据要发送到的孩子。
更多信息的文档