我正在使用Python来执行外部程序。我还希望Python向被调用的程序发送一些键击以完成自动登录。
问题在于,当我使用subprocess.call()执行外部程序时,程序得到了系统关注,并且在我关闭外部程序之前,Python脚本无法响应。
你们有什么建议吗?非常感谢。
答案 0 :(得分:6)
使用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读取数据,直到达到文件结尾。 等待进程终止。可选的输入参数应为a 要发送到子进程的字符串,如果没有数据,则为None 寄给孩子。
更多信息in the docs