2

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

问题是当我使用 subprocess.call() 执行外部程序时,程序获得了系统焦点,并且 Python 脚本无法响应,直到我关闭外部程序。

大家对此有什么建议吗?非常感谢。

4

1 回答 1

6

使用subprocess.Popen()代替.call()

Popen您还可以控制stdinstdoutstderr文件描述符,因此您可以与外部程序进行交互。

愚蠢的例子:

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。

文档中有更多信息

于 2012-05-31T08:59:40.503 回答