subprocess 模块用来产生新的进程并连接到它的 input/output/error 管道,获得它的返回代码。这个模块被用来替代旧的模块和功能:

os.system
os.spawn*

使用 subprocess 模块

建议使用 run() 方法调用 subprocess 可以处理的所有用例。对于其他高级用例,可以直接使用 下划线管道接口

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

依照传入的 args 参数运行命令。等待命令完成,然后返回 CompletedProcess 实例。

如果 capture_output 设为 true,则捕获 stdoutstderr。这时,Popen 对象会自动携带 stdout=PIPEstderr=PIPE 创建,可以不用再设置这里的 stdoutstderr 参数。

timeout 参数会被传入 Popen.communicate()。如果超时,子进程将被杀掉。子进程终止时 TimeoutExpired 异常会被再次激发。

input 参数会被传入 Popen.communicate() 以及 subprocess 的 stdin。如果使用它,它必须是一个字节序列,或一个字符串,如果 encodingerrors 被指定或 textTrue。使用时,内部的 Popen 对象会自动携带 stdin=PIPE 创建, 可以不用再设置这里的 stdin 参数。

如果 check 设为 True,且进程以非零代码退出,就会激发 CalledProcessError 异常。异常的属性包括它捕获的参数、退出代码以及 stdoutstderr

如果设定了 encodingerrorstext 设为 true,则文件对象将会用设定的编码和错误或默认的 io.TextIOWrapper 打开。universal_newlines 参数与 text 效果相同,并向后兼容。文件对象默认以二进制模式打开。

如果 env 的值不为 None,他必须映射到新进程中定义的环境变量。它将替代从当前进程继承的环境变量值。它被直接传入 Popen

示例:

>>> subprocess.run(["ls", "-l"])  # 不捕获输出
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')

Reference