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了]
  • 源码初探:

 

 

 

 

 

 

 

 

 

 

 

参考资料:

 

posted @ 2023-01-20 09:17  o蹲蹲o  阅读(132)  评论(0编辑  收藏  举报