python子进程非阻塞并返回输出

时间:2011-12-13 02:33:09

标签: python subprocess

我知道很多次都会问这个问题,但我还没有找到合适的方法。如果我想运行本地命令,文档说我必须使用子进程,因为它正在替换所有其他方法,如os.system / peopen等。

如果我在我的程序中调用subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)并且命令是例如将我的计算机连接到VPN的openvpn指令,则该进程将无限期挂起,因为openvpn返回它的输出以新行结尾但挂在那里连接,我的程序也是如此(冻结)。

有人说我应该删除确实以非阻塞方式工作的stdout=subprocess.PIPE但是然后一切都被打印到控制台而不是我对输出有某种控制(也许我不想打印它)。

有没有某种正确的方法可以做到这一点,例如,可以以非阻塞的方式执行命令并控制输出。?

2 个答案:

答案 0 :(得分:0)

如果指定stdout = PIPE,则子进程将写入管道并在管道缓冲区已满时挂起。 python程序不会挂起--Popen是异步的,这就是为什么稍后可以调用Popen.wait()来等待子进程退出的原因。从Popen.stdout读取以保持子流程满意,并根据需要打印,丢弃或处理输出。

答案 1 :(得分:-1)

考虑在终端内运行您的流程。例如,

subprocess.Popen("xterm -e /bin/bash -c '/path/to/openvpn'", shell=True)

甚至,你可以试试,

import shlex
subprocess.Poen(shlex.split("xterm -e /bin/bash -c '/path/to/openvpn'"), shell=False)