subprocess该模块允许您生成新进程,连接到其输入/输出/错误管道,并获取其返回代码。该模块打算替换几个较旧的模块和功能:
os.system
os.spawn*
使用模块subprocess
推荐的调用子流程的方法是将该run() 功能用于它可以处理的所有用例。对于更高级的用例,Popen可以直接使用基础接口。
该run()功能是在Python 3.5中添加的;如果您需要保留与旧版本的兼容性,请参见“ 旧版高级API”部分。
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实例。
上面显示的参数仅仅是最常用的参数,下面在“ 常用参数”中进行 了描述(因此在缩写签名中使用了仅关键字表示法)。完整的函数签名与Popen构造函数的签名基本相同-该函数的大多数参数都传递给该接口。(timeout, input, check和capture_output不是。)
如果capture_output为true,则将捕获stdout和stderr。使用时,将Popen使用stdout=PIPE和自动创建内部对象 stderr=PIPE。的标准输出和stderr的参数可能不能在相同的时间被供给capture_output。如果您希望捕获并将这两个流合并为一个,请使用stdout=PIPE和,stderr=STDOUT 而不是capture_output。
在超时参数传递给Popen.communicate()。如果超时到期,子进程将被终止并等待。该 TimeoutExpired异常会被重新提出的子进程终止后。
该输入参数被传递给Popen.communicate()并因此给 子过程的标准输入。如果使用,则必须为字节序列,如果指定了编码或错误或文本为true ,则必须为字符串 。使用内部Popen对象时,它会使用自动创建 stdin=PIPE,并且stdin参数也不能使用。
如果check为true,并且进程以非零退出代码退出, CalledProcessError则会引发异常。该异常的属性包含参数,退出代码以及stdout和stderr(如果已捕获)。
如果指定了编码或错误,或者文本为true,则使用指定的编码和错误或io.TextIOWrapper默认设置,以文本模式打开stdin,stdout和stderr的文件对象。该universal_newlines参数等同于文本,并提供向后兼容性。默认情况下,文件对象以二进制模式打开。
如果env不是None,则它必须是为新进程定义环境变量的映射。这些被用来代替继承当前进程环境的默认行为。它直接传递给Popen。
例子:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
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'')
3.5版中的新功能。
3.6版中的更改:添加了编码和错误参数
在3.7版中进行了更改:添加了text参数,作为Universal_newlines的更易理解的别名。添加了capture_output参数。
class subprocess.CompletedProcess
来自的返回值run(),表示已完成的过程。
args
用于启动进程的参数。这可以是列表或字符串。
returncode
子进程的退出状态。通常,退出状态为0表示它已成功运行。
负值-N表示该子级已被信号终止 N(仅POSIX)。
stdout
从子进程中捕获的标准输出。一个字节序列,或者一个字符串(如果 run()使用编码,错误或text = True调用)。 None如果未捕获stdout。
stderr
从子进程中捕获了stderr。一个字节序列,或者一个字符串(如果 run()使用编码,错误或text = True调用)。 None如果未捕获stderr。
check_returncode()
如果returncode为非零,则引发CalledProcessError。
subprocess.DEVNULL
可以用作stdin,stdout或stderr参数的特殊值,Popen并指示os.devnull 将使用特殊文件。
subprocess.PIPE
可以用作stdin,stdout或stderr参数的特殊值,Popen指示应打开到标准流的管道。最有用的Popen.communicate()。
subprocess.STDOUT
可以用作stderr参数的特殊值,它Popen指示标准错误应与标准输出进入同一句柄。
exception subprocess.SubprocessError
该模块所有其他异常的基类。
exception subprocess.TimeoutExpired
SubprocessError的子类,在等待子进程超时时引发。
cmd
用于产生子进程的命令。
timeout
超时(以秒为单位)。
output
子进程的输出(如果被run()或 捕获)check_output()。否则,None。
stdout
输出的别名,用于与对称stderr。
stderr
子进程的Stderr输出(如果被捕获)run()。否则,None。
版本3.3中的新功能。
在版本3.5中进行了更改:添加了stdout和stderr属性
exception subprocess.CalledProcessError
SubprocessError的子类,当进程运行check_call()或返回非零退出状态时引发check_output() 。
returncode
子进程的退出状态。如果该过程由于信号而退出,则这将是负信号号。
cmd
用于产生子进程的命令。
output
子进程的输出(如果被run()或 捕获)check_output()。否则,None。
stdout
输出的别名,用于与对称stderr。
stderr
子进程的Stderr输出(如果被捕获)run()。否则,None。
常用参数
为了支持各种用例,Popen构造函数(和便捷函数)接受大量可选参数。对于大多数典型用例,可以安全地将其中许多参数保留为其默认值。最常用的参数是:
args是所有调用所必需的,并且应为字符串或程序参数序列。通常最好提供一个参数序列,因为它允许模块处理任何必需的参数转义和引用(例如,允许在文件名中保留空格)。如果传递单个字符串,则必须使用shellTrue(请参见下文),否则该字符串必须简单地命名要执行的程序而无需指定任何参数。
stdin,stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为PIPE,DEVNULL现有文件描述符(正整数),现有文件对象和None。 PIPE指示应该创建到子级的新管道。 DEVNULL表示os.devnull将使用特殊文件。使用默认设置时None,将不会发生重定向。子级的文件句柄将从父级继承。另外,stderr可以是 STDOUT,它指示子进程的stderr数据应捕获到与stdout相同的文件句柄中。
如果指定了编码或错误,或者文本(也称为 Universal_newlines)为true,则将使用调用中指定的编码和错误或的默认值以文本模式打开文件对象stdin,stdout和stderr。io.TextIOWrapper
对于stdin,输入中的行尾字符’\n’将转换为默认的行分隔符os.linesep。对于stdout和stderr,输出中的所有行尾都将转换为’\n’。有关更多信息,请参见io.TextIOWrapper当类的构造函数的newline参数为时该类的文档None。
如果不使用文本模式,则stdin,stdout和stderr将作为二进制流打开。不执行编码或行尾转换。
3.6版的新功能:添加了编码和错误参数。
版本3.7中的新增功能:添加了text参数作为Universal_newlines的别名。
注意 文件对象的newlines属性Popen.stdin, Popen.stdout并且Popen.stderr不会通过该Popen.communicate()方法进行更新。
如果shell是True,则将通过Shell执行指定的命令。如果您主要将Python用于大多数系统外壳程序提供的增强控制流,并且仍然希望方便地访问其他外壳程序功能(例如外壳程序管道,文件名通配符,环境变量扩展以及扩展~到用户的主目录),则这很有用。。但是请注意,Python本身提供了很多贝壳般的功能实现(特别是glob, fnmatch,os.walk(),os.path.expandvars(), os.path.expanduser(),和shutil)。
改变在3.3版本:当universal_newlines是True,类使用的编码 locale.getpreferredencoding(False) 来代替locale.getpreferredencoding()。有关io.TextIOWrapper此更改的更多信息,请参见 课程。
POPEN构造
该模块中的基础流程创建和管理由Popen类处理。它提供了很大的灵活性,以便开发人员能够处理便捷功能未涵盖的不太常见的情况。
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)
在新进程中执行子程序。在POSIX上,该类使用 os.execvp()类似行为来执行子程序。在Windows上,该类使用Windows CreateProcess()函数。的参数 Popen如下。
args应该是程序参数的序列,或者是单个字符串。默认情况下,如果args是序列,则要执行的程序是args中的第一项。如果args是字符串,则解释取决于平台,并在下面进行描述。有关 默认行为的其他区别,请参见shell和可执行参数。除非另有说明,否则建议将args作为序列传递。
在POSIX上,如果args是字符串,则将该字符串解释为要执行的程序的名称或路径。但是,只有在不将参数传递给程序的情况下才能执行此操作。
>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input</