1.subprocess模块简介

标准库subprocess允许创建子进程,连接子进程的输入、输出、错误管道,并且获取它们的返回码。该标准库提供了run()、call()和Popen()三种不同的函数用于创建子进程,其中run()函数会阻塞当前进程,子进程结束后返回包含返回码和其他信息的CompletedProcess对象;call()函数也会阻塞当前进程,子进程结束后直接得到返回码;Popen()函数创建子进程时不阻塞当前进程,直接返回得到Popen对象,通过该对象可以对子进程进行更多的操作和控制。例如,Popen对象的kill()和terminate()方法可以用来结束该进程,send_signal()可以给子进程发送指定信号,wait()方法用来等待子进程运行结束,pid用来表示子进程的ID号,等待。

2.subprocess模块方法详解

2.1 run()方法

run()方法是在 Python 3.5 被添加的,用于运行被 arg 描述的指令。等待指令完成,然后返回一个 CompletedProcess 示例。run 方法的参数和 Popen 的构造函数一样,接受的大多数参数都被传递给该接口。(timeout, input, check 和 capture_output 除外)。

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, **other_popen_kwargs)
#常用参数详解:
(1)args:要执行的shell命令,默认应该是一个字符串序列,如['df', '-Th']或('df', '-Th'),也可以是一个字符串,如'df -Th',但是此时需要把shell参数的值置为True。

(2)input:input参数将被传递给Popen.communicate() 以及子进程的标准输入。 如果使用此参数,它必须是一个字节序列。 如果指定了 encoding 或 errors 或者将 text 
设置为 True,那么也可以是一个字符串。 当使用此参数时,在创建内部 Popen对象时将自动带上 stdin=PIPE,并且不能再手动指定 stdin 参数。

(3)stdin、stdout 和 stderr:子进程的标准输入、输出和错误。其值可以是subprocess.PIPE、subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。
subprocess.PIPE表示为子进程创建新的管道,subprocess.DEVNULL表示使用os.devnull。默认使用的是 None,表示什么都不做。另外,stderr设置为STDOUT时,stderr合并到 stdout 里一起输出。
该参数是传递给Popen.communicate(),通常该参数的值必须是一个字节序列,如果universal_newlines=True,则其值应该是一个字符串。

(4)capture_output:如果 capture_output 设为 true,stdout 和 stderr 将会被捕获。在使用时,内置的 Popen对象将自动用 stdout=PIPE 和 stderr=PIPE 创建。
stdout 和 stderr 参数不应当与 capture_output 同时提供。如果你希望捕获并将两个流合并在一起,使用 stdout=PIPE 和 stderr=STDOUT 来代替 capture_output。

(5)shell:如果shell为True,那么指定的命令将通过shell执行。如果我们需要访问某些shell的特性,如管道、文件名通配符、环境变量扩展功能,这将是非常有用的。当然,
python本身也提供了许多类似shell的特性的实现,如glob、fnmatch、os.walk()、os.path.expandvars()、os.expanduser()和shutil等。shell为真,unix下相当于args前面添加了"/bin/sh "" -c",
windows下相当于添加"cmd.exe /c"

(6)cwd: 设置工作目录

(7)timeout:timeout 参数将被传递给 Popen.communicate()。如果发生超时,子进程将被杀死并等待,TimeoutExpired 异常将在子进程中断后被抛出。

(8)check:如果check参数的值是True,且执行命令的进程以非0状态码退出,则会抛出一个CalledProcessError的异常,且该异常对象会包含参数、退出状态码、以及stdout
和stderr(如果它们有被捕获的话)

(9)encoding/error/text:如果 encoding 或者 error 被指定, 或者 text 被设为 True, 标准输入, 标准输出和标准错误的文件对象将通过指定的 encoding 和 errors 
以文本模式打开, 否则以默认的io.TextIOWrapper 打开。

(10)universal_newline:universal_newline参数等同于 text 并且提供了向后兼容性。 默认情况下, 文件对象是以二进制模式打开的。

(11)env:如果 env 不是 None, 它必须是一个字典, 为新的进程设置环境变量;它用于替换继承的当前进程的环境的默认行为. 它将直接被传递给 Popen。
run()参数详解

相关文章: