一些答案(first,second)已经提到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()。