1.1 基本功能
- subprocess 模块,允许生成新的进程执行命令行指令,python程序,以及其它语言编写的应用程序, 如 java, c++,rust 应用等。
- subprocess可连接多个进程的输入、输出、错误管道,并且获取它们的返回码。
- asyncio也支持subprocess.
许多知名库都在使用此模块创建进程,以及做为跨语言粘合工具。典型如ansible, celery,selenium 等。
1.2 与multiprocessing主要区别
- multiprocessing 创建的子进程的代码也需要开发者实现。
- subprocess创建的子进程主要用于运行已有指令或应用。
根据上述主要区别,不难推断出, subprocess创建子进程的用途,主要用于执行非python的外部程序,如windows/linux 命令,C程序,Java程序等,而且可以实现进程通信,多进程管道,以及异步执行等。
1.3 subprocess 模块主要掌握知识点
(1)run()方法创建子进程
(2)stdin, stdout,stderr 的配置,以及管道使用
(3)Popen API使用。
(4)进程之间通信
2 使用run() 方法创建子进程
2.1 run() 语法
subprocess.run(args, \*, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, text=None, env=None)
返回值类型:
subprocess.CompletedProcess
主要参数:
- args:表示要执行的命令。必须是以字符串为元素的 list or tuple 。
- stdin、stdout 和 stderr:子进程的标准输入、输出和错误。其值可以是 subprocess.PIPE、subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。subprocess.PIPE 表示为子进程创建新的管道。subprocess.DEVNULL 表示使用 os.devnull。默认使用的是 None,表示什么都不做。
- encoding: 如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否则只接收 bytes 类型的数据。
- shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
- check: 如check=true, 当进程退出码为非0时,将生成 CalledProcessError 异常
2.2 返回对象CompletedProcess的主要属性与方法:
主要属性:
- args 执行指令list or tuple
- returncode 执行完子进程状态码,为0则表明它已经运行完毕,若值为负值 ,表明子进程被终