subprocess对子进程的运行可控,所以对于稍复杂的项目可以作为对os模块的替换。
subprocess.wait() #对子进程人工进行阻塞
subprocess.communicate() #对子进程的结果进行交互
subprocess.pid # 子进程号
subprocess.kill() #杀死子进程
subprocess.epoll() # 执行是否完成
短时间获取结果,推荐使用:
proc = subprocess.Popen(['ls'], stdout=subprocess.PIPE, stderr=DN)
for line in proc.communicate()[0].split("\n"):
print(line)
长时间运行的命令,推荐使用以下方式:
proc = subprocess.Popen(['ping', "www.baiduc.com"], stdout=subprocess.PIPE, stderr=DN)
while proc.poll() is None:
seconds_passed = time.time() - t_beginning
if seconds_passed > OUTTIME:
proc.terminate()
break
for i in proc.stdout.readlines():
print(i)
- 避免使用wait,以防死锁
- call和check_call返回执行结果,而check_output将执行结果以字符串的形式返回
- 需要创建守护进程,使用preexec_fn=os.setsid, close_fds=True