Python学习笔记-常用模块介绍--subprocess函数
1.什么是subprocess?
- 是英文翻译过来,是子进程的意思。
- sub 儿子 ;process 进程
2.示例1:
import subprocess # sub是儿子的意思,这个函数是开启了子进程。 import time res = subprocess.Popen("tasklist",shell=True) # shell=True 是调用命令解释器来解释 tasklist 这个字符串
# P 是process的意思
# Popen 是开启一个进程的意思。
time.sleep(3) # 给子进程执行留些时间 print(res)
3.subprocess是子进程,主进程想拿到子进程的内容怎么拿?
- 借用管道。
4.那么管道是什么?
- 进程与进程之间是隔离的,他们的内容不能互通,怎么办呢?
- 我们在两个隔离的空间中,开一个洞,打通一个管道,这样他们就可以传输内容了。
5. 那么,怎么在子进程和主进程之间创建管道呢?
- 调用subprocess的时候,增加参数,subprocess.PIPE
- 示例:
-
obj = subprocess.Popen("tasklist",shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) print(obj) print(obj.stdout.read()) # 读取数据 byte类型 print(obj.stdout.read().decode("GBK")) # 读取数据后进行解码
- 参数解释:
- stdout:标准输出
- stderr:错误输出
- subprocess.PIPE 打开一个管道
- obj 返回一个对象,
- obj.stdout.read() 通过返回的对象,的标准输出管道,读取数据,byte类型。
- obj.stdou.read().decode('GBK') 通过返回的对象,的标准输出管道,读取数据后,用GBK解码显示 (windows操作系统下,默认是GBK)
- 注意:
- 这里的管道只能读取一次,第二次就拿不到数据了。
6.如何等待子进程结束?
- 加入res.wait()
import subprocess
from config import MODEL,VIDEO,PLUGIN,DEVICE,OUTPUT
# 执行ls命令并获取输出结果
cmd = f"timeout 5 python3 liqi.py {MODEL} {VIDEO} {PLUGIN} {DEVICE} {OUTPUT}"
res = subprocess.Popen(cmd,shell=True)
res.wait() # 等待子进程结束【加这句】
# 输出结果
print(res)
7.等待子进程的方式2(Python3.6)
- 好像Python3.5以后出了一个call,Python3.7以后出了一个run
- 目前我是Python3.6,我用call
- 来自AI的建议
-
cmd = f"timeout {INTERVAL} python3 inferyolov5_liqi.py {MODEL} {VIDEO} {PLUGIN} {DEVICE} {outpath}" res = subprocess.call(cmd, shell=True) # [用call就行,不用wait了]
- 源码初探:
参考资料: