check_call()``/bin/sh进程退出后立即返回,而无需等待后代进程(假设
shell=True与您的情况相同)。
check_output()等待直到读取所有输出。如果
ssh继承管道,则
check_output()它将等待直到退出(直到关闭其继承的管道末端)。
check_call()代码示例:
#!/usr/bin/env pythonimport subprocessimport sysimport timestart = time.time()cmd = sys.executable + " -c 'import time; time.sleep(2)' &"subprocess.check_call(cmd, shell=True)assert (time.time() - start) < 1
不读取输出;
check_call()立即返回,而无需等待孙子后台python进程。
check_call()就是
Popen().wait()。
Popen()启动外部进程并立即返回,而无需等待其退出。
.wait()收集进程的退出状态-
它不等待其他(孙代)进程。
如果读取了输出(重定向并孙子python进程继承了stdout管道):
start = time.time()subprocess.check_output(cmd, shell=True)assert (time.time() - start) > 2
然后等待直到继承管道的后台python进程退出。
check_output()调用
Popen().communicate(),以获取输出。内部
.communicate()调用,
.wait()即
check_output()也等待外壳退出并
check_output()等待EOF。
如果孙子不继承管道,则
check_output()不要等待它:
start = time.time()cmd = sys.executable + " -c 'import time; time.sleep(2)' >/dev/null &"subprocess.check_output(cmd, shell=True)assert (time.time() - start) < 1
孙子的输出被重定向到
/dev/null即不继承父管道的输出,因此
check_output()可以不等待而退出。
注意:
&最后将孙子python进程置于后台。在默认情况下
shell=True启动
cmd.exe的Windows上,它将无法使用。



