如何验证subprocess.Popen是非阻塞的

时间:2016-11-15 22:40:48

标签: python subprocess popen nonblocking

一些答案​​(firstsecond)已经提到subprocess.Popen是一种非阻塞呼叫。

什么是可以验证它的简单示例,或者可以用来向初学者解释它。

我尝试了以下代码。它显示在打印ls -lrt输出之前打印“完成”,但只要在命令sleep 10之前添加ls -lrt,它就会等待命令完成。

import logging
import os
import subprocess
import signal
import time

log = logging.getLogger(__name__)


class Utils(object):

    @staticmethod
    def run_command(cmnd, env=None, cwd=None, timeout=0):
        p = subprocess.Popen(cmnd, shell=True, stdin=None, bufsize=-1, env=env,
                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
                             close_fds=True, cwd=cwd, preexec_fn=os.setsid)

        #stdout_val = p.communicate()[0]
        stdout_val = p.stdout.read()
        return p.returncode, stdout_val.strip()

if __name__ == '__main__':
    print "Start"
    print "Invoke command"
    status, output = Utils.run_command("ls -lrt")   # line - 10
    #status, output = Utils.run_command("sleep 10;ls -lrt") # line - 11
    for i in xrange(10):
        print "Finish"
    print status
    print output

编辑1:在建议之后用p.stdout.read()替换调用p.communicate()。

0 个答案:

没有答案