我正在使用 Python 执行外部程序。而且我还希望 Python 向被调用程序发送一些击键以完成自动登录。
问题是当我使用 subprocess.call() 执行外部程序时,程序获得了系统焦点,并且 Python 脚本无法响应,直到我关闭外部程序。
大家对此有什么建议吗?非常感谢。
使用subprocess.Popen()
代替.call()
Popen
您还可以控制stdin、stdout和stderr文件描述符,因此您可以与外部程序进行交互。
愚蠢的例子:
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() 检查子进程是否已经终止。设置并返回 returncode 属性。
Popen.wait() 等待子进程终止。设置并返回 returncode 属性。
Popen.communicate(input=None) 与进程交互:向标准输入发送数据。从 stdout 和 stderr 读取数据,直到到达文件结尾。等待进程终止。可选的输入参数应该是要发送到子进程的字符串,或者如果不应该向子进程发送数据,则为 None。
文档中有更多信息