我知道很多次都会问这个问题,但我还没有找到合适的方法。如果我想运行本地命令,文档说我必须使用子进程,因为它正在替换所有其他方法,如os.system / peopen等。
如果我在我的程序中调用subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
并且命令是例如将我的计算机连接到VPN的openvpn指令,则该进程将无限期挂起,因为openvpn返回它的输出以新行结尾但挂在那里连接,我的程序也是如此(冻结)。
有人说我应该删除确实以非阻塞方式工作的stdout=subprocess.PIPE
但是然后一切都被打印到控制台而不是我对输出有某种控制(也许我不想打印它)。
有没有某种正确的方法可以做到这一点,例如,可以以非阻塞的方式执行命令并控制输出。?
答案 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)