最近在项目中有使用 subprocess 这个模块,它的功能主要是fork一个子进程,并且运行一个外部的程序。说白了就是可以用这个模块可以根据输入的字符串执行对应的系统 shell 指令。项目中正好需要执行一段系统shell指令,所以就选用了这个模块。
subprocess模块中只定义了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下:
代码语言:javascript复制subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
1.常用参数介绍:
参数 args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。我们也可以显式的使用executeable参数来指定可执行文件的路径。
参数 stdin、stdout、stderr 分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。
参数 shell 设为 true ,程序将通过 shell 来执行。
executable参数,指定要执行的程序, 一般程序可以由 args 参数指定。如果 shell=True ,executable 可以用于指定用哪个 shell 来执行(比如bash、csh、zsh等)。linux下,默认是 /bin/bash
universal_newlines参数,如果把 universal_newlines 设置成True,则子进程的 stdout 和 stderr 被视为文本对象,并且不管是 linux 的行结束符('/n'),还是老mac格式的行结束符('/r' ),还是windows 格式的行结束符'/r/n')都将被视为'/n' 。
subprocess.PIPE 表示一个可以被用于Popen的stdin 、stdout 和stderr 3个参数的特输值,表示需要创建一个新的管道。
subprocess.STDOUT 表示一个可以被用于 Popen 的 stderr 参数的输出值,表示子程序的标准错误汇合到标准输出。
2.Popen的方法:
Popen.poll(), 用于检查子进程是否已经结束。设置并返回returncode属性。
Popen.wait(), 等待子进程结束。设置并返回returncode属性。
Popen.pid,获取子进程的进程ID。
Popen.returncode, 获取进程的返回值。如果进程还没有结束,返回None。
Popen.stdin,Popen.stdout (这个是阻塞的属性),Popen.stderr 官方文档上这么说:
stdin, stdout and stderr specify the executed programs’ standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None.
stdin、stdout 和 stderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄。 有效值为 PIPE、现有文件描述符(正整数)、现有文件对象和无。
3.stdin, stdout and stderr详细介绍
在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流,也就是stdin, stdout and stderr这三个。
三个数据流默认是表现在用户终端上的执行一个shell命令行时通常会自动打开三个标准文件:
标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件stderr),这两个文件都对应终端的屏幕。
进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。