如何启动输入并将输入传递给外部程序

时间:2012-05-31 08:58:17

标签: python autologin

我正在使用Python来执行外部程序。我还希望Python向被调用的程序发送一些键击以完成自动登录。

问题在于,当我使用subprocess.call()执行外部程序时,程序得到了系统关注,并且在我关闭外部程序之前,Python脚本无法响应。

你们有什么建议吗?非常感谢。

1 个答案:

答案 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