– 子进程管理 – 并发执行(Python教程)(参考资料)
subprocess
– 子进程管理
源代码: Lib / subprocess.py
subprocess
模块允许你生成新进程,连接到他们的输入/输出/错误管道,并获取其返回代码。该模块旨在替换几个较旧的模块和功能:
os.systemos.spawn*
有关如何使用subprocess
模块替换这些模块和功能的信息可以在以下部分找到.
参见还
PEP 324 – PEP提出子进程模块
使用subprocess
模块
调用子进程的推荐方法是将run()
函数用于它可以处理的所有用例。对于更高级的用例,可以直接使用Popen
接口.
run()
函数在Python 3.5中添加;如果你需要保持与旧版本的兼容性,请参阅较旧的高级API section.
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是真的,stdout和stderr将被捕获。使用时,内部
Popen
使用stdout=PIPE
和stderr=PIPE
自动创建对象。stdout和stderr参数也可能不被使用.timeout参数传递给
Popen.communicate()
。如果timeoutexpires,子进程将被终止并等待。在子进程终止后,TimeoutExpired
异常将被重新提升.input参数传递给
Popen.communicate()
并因此传递给子进程的stdin。如果使用它必须是字节序列,或者如果指定encoding或errors或者text为真,则为字符串。使用时,内部Popen
使用stdin=PIPE
自动创建对象,并且stdin参数也可能不被使用.如果check为真,则进程退出非零退出代码,将引发
CalledProcessError
异常。thatexception的属性包含参数,退出代码,stdout和stderr,如果它们被捕获的话.如果指定encoding或errors,或text是true,stdin,stdout和stderr的文件对象在文本模式下使用指定的encoding和errors或
io.TextIOWrapper
default打开.universal_newlines参数相同到text并提供向后兼容性。默认情况下,文件对象以二进制模式打开.如果env不是
None
,它必须是定义新进程的环境变量的映射;这些用于代替继承当前进程环境的defaultbehavior。它直接传递给Popen
.示例:
>>> subprocess.run(["ls", "-l"]) # doesn"t capture outputCompletedProcess(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:添加了encoding和errors参数
在版本3.7中更改:添加了text参数,作为universal_newlines更易理解的别名。添加了capture_output参数
- class
subprocess.
CompletedProcess
-
来自
run()
的返回值,表示已完成的进程.args
-
用于启动进程的参数。这可能是一个列表或一个字符串.
stdout
-
从子进程捕获的stdout。一个字节序列,或一个字符串,如果
run()
被调用,带有编码,错误或text = True .None
如果没有捕获stdout .如果你运行了这个过程使用
stderr=subprocess.STDOUT
,stdout和stder将合并到这个属性中,stderr
将None
.
stderr
-
从子进程中捕获stderr。一个字节序列,或一个字符串,如果
run()
被调用,编码,错误或文本=真.None
如果没有捕获stderr.
check_returncode
()-
如果
returncode
非零,请在版本3.5中添加CalledProcessError
.
新增.
subprocess.
DEVNULL
-
可用作stdin, stdout或stderr参数
Popen
的特殊值,表示将使用特殊文件os.devnull
.版本3.3.
subprocess.
STDOUT
-
最有用的特殊值可以用作stderr的
Popen
并指示标准错误应该与标准输出相同的句柄.
- exception
subprocess.
SubprocessError
-
此模块中所有其他异常的基类.
3.3版本中的新功能
- 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
.
在版本3.5中更改:stdout和stderr属性添加
常用的参数
为了支持各种各样的用例,Popen
构造函数(和便捷函数)接受大量可选参数。对于大多数典型的用例,许多这些参数可以安全地保留在其默认值。最常需要的论据是:
args所有调用都需要它,并且应该是一个字符串或一系列程序参数。提供一系列参数通常是优选的,因为它允许模块处理任何所需的转义和引用参数(例如,允许文件名中的空格)。如果传递单个字符串,shell必须是
True
(见下文)或者字符串必须简单地命名要执行的程序而不指定任何参数.stdin, stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为
PIPE
,DEVNULL
,现有文件描述符(正整数),现有文件对象,以及None
.PIPE
表示应创建到子节点的新管道。DEVNULL
表示将使用特殊文件os.devnull
。使用None
的默认设置,不会发生重定向;子项的文件句柄将从父项继承。另外,stderr可以STDOUT
,表示来自子进程的stderr数据应该被捕获到与stdout.相同的文件句柄中。如果指定了encoding或errors,或者text(也称为universal_newlines)是真的,文件对象stdin, stdout和stderr将在文本模式中使用encoding和errors打开在
io.TextIOWrapper
.的调用或默认值中指定对于stdin,输入中的行结束字符
"\n"
将被转换为默认行分隔符os.linesep
。对于stdout和stderr,输出中的所有行结尾都将转换为"\n"
。有关更多信息,请参阅io.TextIOWrapper
类的文档,其构造函数的newline参数是None
.如果没有使用文本模式,stdin, stdout和stderr将打开asbinary streams。没有执行编码或行结束转换.
新版本3.6:添加了encoding和errors参数
新版本3.7:添加了text参数作为universal_newlines.
的别名注意
文件对象的新行属性
Popen.stdin
,Popen.stdout
和Popen.stderr
没有更新Popen.communicate()
方法// shell是
True
,指定的命令将通过shell执行。如果您主要使用Python来提供它在大多数系统shell上提供的增强控制流,并且仍然希望方便地访问其他shell功能,例如shell管道,filenamewildcards,环境变量扩展和~
到auser的主目录。但是,请注意Python本身提供了许多类似shell的功能的实现(特别是glob
,fnmatch
,os.walk()
,os.path.expandvars()
,os.path.expanduser()
,和shutil
).改版3.3:什么时候 universal_newlines是
True
,该类使用编码locale.getpreferredencoding(False)
而不是locale.getpreferredencoding()
。有关此更改的更多信息,请参阅io.TextIOWrapper
课程.注意
使用之前阅读安全注意事项部分
shell=True
.
这些选项以及所有其他选项在Popen
构造函数文档中更详细地描述.
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上,该类使用WindowsCreateProcess()
功能。Popen
的参数如下:args应该是程序参数序列或者是单个字符串。默认情况下,要执行的程序是args中的第一项如果args是一个序列。如果args是一个字符串,则解释依赖于平台并在下面描述。有关与默认行为的其他差异,请参阅shell和executable参数。除非另有说明,否则建议将args作为序列传递
在POSIX上,如果args是一个字符串,该字符串被解释为要执行的程序的名称或路径。但是,只有在不通过程序参数时才能这样做.
注意
shlex.split()
在确定args的正确识别时非常有用,特别是在复杂的情况下:>>> import shlex, subprocess>>> command_line = input()/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo "$MONEY"">>> args = shlex.split(command_line)>>> print(args)["/bin/vikings", "-input", "eggs.txt", "-output", "spam spam.txt", "-cmd", "echo "$MONEY""]>>> p = subprocess.Popen(args) # Success!
特别注意由shell中的空格分隔的选项(例如-input)和参数(例如eggs.txt)在单独的列表元素中,而需要引用或反斜杠转义的参数当在shell中使用时(例如包含空格的文件名或上面提到的echo命令)是单个列表元素.
在Windows上,如果args是一个序列,它将被转换在中描述的amanner中的字符串将参数序列转换为Windows 上的字符串。这是因为底层
CreateProcess()
对字符串进行操作shell参数(默认为
False
)指定是否使用shell作为要执行的程序。如果shell是True
,建议通过args作为一个字符串而不是一个序列.在POSIX上
shell=True
,shell默认为/bin/sh
。如果args是一个字符串,则该字符串指定通过shell执行的命令。这意味着必须格式化字符串,就像在shell提示符下键入时一样。这包括,例如,引用或反斜杠转义带有空格的文件名。如果args是一个序列,则第一个项指定命令字符串,并且任何其他项将被视为shellitself的附加参数。也就是说,Popen
相当于:Popen(["/bin/sh", "-c", args[0], args[1], ...])
在带
shell=True
的Windows上,COMSPEC
环境变量指定默认的shell。你需要在Windows上指定shell=True
的唯一时间是你希望执行的命令内置到shell中(例如 dir 或 copy)。你不需要shell=True
来运行一个批处理文件或基于控制台的可执行文件.注意
在使用
shell=True
.bufsize在创建stdin / stdout / stderr管道文件对象时,它将作为
open()
函数的相应参数提供:0
表示无缓冲(读写是单系统调用,可以返回短路)1
表示行缓冲(仅在universal_newlines=True
时可用,即在文本模式下)- 任何其他正值表示使用大约该大小的缓冲区
- 负bufsize(默认值)表示将使用系统默认的ofio.DEFAULT_BUFFER_SIZE。
在版本3.3.1中更改:bufsize现在默认为-1,默认情况下启用缓冲以匹配大多数代码所期望的行为。在Python 3.2.4和3.3.1之前的版本中,它错误地默认为
0
,它是无缓冲的,允许短读。这是无意的,并且与大多数代码所期望的Python 2的行为不匹配.executable参数指定要执行的替换程序。这很少需要。当
shell=False
, executable替换由args指定执行的程序时。不过,原来的args尚未传递给该计划。大多数程序将args指定的程序视为命令名,然后可以与程序执行的命令名不同。在POSIX上,args name成为实用程序中可执行文件的显示名称,例如 ps 。如果shell=True
,在POSIX上executable arguments指定一个替换shell,默认为/bin/sh
.stdin, stdout和stderr指定执行程序的标准输入,标准输出和标准错误文件分别处理。有效值是
PIPE
,DEVNULL
,一个现有的文件描述符(一个正整数),一个现有的文件对象,和None
.PIPE
表示一个给孩子的新管道应该创建。DEVNULL
表示将使用特殊文件os.devnull
。使用None
的默认设置,不会发生重定向;孩子的文件句柄将从父母继承。另外,stderr可以STDOUT
,表示来自应用程序的stderr数据应该被捕获到与stdout相同的文件句柄中//如果preexec_fn设置为可调用对象,该子对象将在执行子进程之前在子进程中调用。(仅限POSIX)
警告
preexec_fn在应用程序中存在线程时使用参数是不安全的。在执行exec之前,子进程可能会死锁。如果你必须使用它,请保持琐碎!最大限度地减少你打电话的图书馆数量.
注意
如果需要修改孩子的环境,请使用env参数,而不是在preexec_fn中执行.start_new_session参数可以取以前常用的地方preexec_fn在孩子中调用os.setsid()
如果close_fds为真,除了
0
,1
和2
之外的所有文件描述符都将在孩子面前关闭进程被执行。否则close_fds是假的,文件描述符服从中描述的继承标志//文件描述符的继承.在Windows上,如果close_fds如果是,则除非在
handle_list
的STARTUPINFO.lpAttributeList
元素中显式传递,或者通过标准句柄重定向传递,否则子进程不会继承句柄.更改版本3.2:的默认值close_fds从改变了
False
如上所述.更改版本3.7:在Windows上,close_fds从改变了
False
至True
重定向标准手柄时。它现在可以设置close_fds至True
重定向标准手柄时pass_fds是一个可选的文件描述符序列,用于在父级和子级之间保持打开状态。提供任何pass_fds力close_fds为
True
。(仅限POSIX)版本3.2中新增: pass_fds参数被添加
如果cwd不是
None
,函数在执行子进程之前将工作目录更改为cwd。cwd可以是str
和路径宾语。特别是,如果可执行路径是相对路径,则函数查找executable(或args中的第一项)相对于cwd.Changed版本3.6:cwd参数接受路径类对象.
如果restore_signals如果为true(默认值),则在exec之前,Python已设置为SIG_IGN的所有信号都将恢复到子进程中的SIG_DFL。当前这包括SIGPIPE,SIGXFZ和SIGXFSZ信号。(仅限POSIX)
更改了版本3.2:restore_signals已添加.
如果start_new_session为真,则会在执行子进程之前在子进程中进行setsid()系统调用。(仅限POSIX)
更改了版本3.2:start_new_session添加了
如果env不是
None
,它必须是一个定义新进程的环境变量的映射;这些用于代替继承当前进程环境的默认行为.注意
如果指定,env必须提供程序执行所需的任何变量。在Windows上,为了运行并排组件,指定env 必须包含有效的
SystemRoot
.如果encoding或errors被指定,或text为真,文件对象stdin, stdout和stderr在文本模式下打开,带有specificiedencoding和errors,如上所述经常使用的参数.universal_newlines参数相当于text并提供向后兼容性。默认情况下,文件对象以二进制模式打开.
版本3.6中新增:encoding和errors添加。
版本3.7的新内容:text被添加为universal_newlines.
的更易读的别名如果给出,startupinfo将是
STARTUPINFO
对象,它被传递给底层CreateProcess
功能creationflags,如果给出,可以是以下一个或多个标志:CREATE_NEW_CONSOLE
CREATE_NEW_PROCESS_GROUP
ABOVE_NORMAL_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
CREATE_NO_WINDOW
DETACHED_PROCESS
CREATE_DEFAULT_ERROR_MODE
CREATE_BREAKAWAY_FROM_JOB
通过
with
声明:退出时,标准文件描述符关闭,等待进程.with Popen(["ifconfig"], stdout=PIPE) as proc: log.write(proc.stdout.read())
在版本3.2中更改:添加了上下文管理器支持.
Exceptions
在新程序开始执行之前,子进程中引发的异常将在父进程中重新提升.
提出的最常见的例外是OSError
。例如,在尝试执行不存在的文件时会发生这种情况。应用程序应该准备OSError
exceptions.
一个 ValueError
如果Popen
调用无效参数
check_call()
如果被调用的进程返回一个非零的返回码,则check_output()
将引发CalledProcessError
所有接受timeout参数的函数和方法,如如call()
和Popen.communicate()
会举起TimeoutExpired
如果超时在进程退出之前到期.
此模块中定义的异常全部继承自SubprocessError
.
版本3.3中的新增内容:添加了
SubprocessError
基类.
安全注意事项
与其他一些popen函数不同,此实现永远不会轻易调用系统shell。这意味着所有字符(包括shell元字符)都可以安全地传递给子进程。如果通过shell=True
显式调用shell,则应用程序负责确保所有空格和元字符被适当地引用以避免出现问题injectionvulnerabilities.
使用shell=True
时,可以使用shlex.quote()
函数来正确地转义将用于构造shell命令的字符串中的空格和shell元字符.
Popen Objects
Popen
类的实例有以下方法:
Popen.
poll
()-
检查子进程是否有终止。设置并返回
returncode
属性。否则,返回None
.
Popen.
wait
(timeout=None)-
等待子进程终止。设置并返回
returncode
属性如果进程在timeout秒后没有终止,则引发
TimeoutExpired
异常。抓住这个例外是安全的并且重新等待.注意
使用
stdout=PIPE
或stderr=PIPE
时会出现死锁,并且子进程会为管道生成足够的输出,以便阻止等待OS管道缓冲区接受更多数据。使用Popen.communicate()
使用烟斗时要避免这种情况.注意
该函数使用繁忙循环(非阻塞调用和短暂睡眠)实现。使用
asyncio
异步等待模块:见asyncio.create_subprocess_exec
.改版3.3:timeout已添加.
Popen.
communicate
(input=None, timeout=None)-
与流程交互:将数据发送到stdin。从stdout和stderr读取数据,直到达到文件结尾。等待进程终止。可选input参数应该是要发送到子进程的数据,或
None
,如果没有数据应该发送给子进程。如果流打开了intext模式,input必须是一个字符串。否则,它必须是bytes.communicate()
返回一个元组(stdout_data, stderr_data)
。如果在文本模式下打开流,数据将是字符串;否则,字节.请注意,如果要将数据发送到进程的stdin,则需要使用
stdin=PIPE
创建Popen对象。同样,要在结果元组中获取除None
以外的任何内容,你需要给stdout=PIPE
和/或stderr=PIPE
也是如果在timeout秒之后进程没有终止,则会引发
TimeoutExpired
异常。捕获此异常并重新进行通信不会丢失任何输出.如果超时到期,子进程不会被杀死,所以为了正确地执行tocleanup,一个行为良好的应用程序应该杀死子进程并完成通信:
proc = subprocess.Popen(...)try: outs, errs = proc.communicate(timeout=15)except TimeoutExpired: proc.kill() outs, errs = proc.communicate()
注意
读取的数据缓冲在内存中,因此如果数据量很大或无限制,请不要使用此方法.
在版本3.3中更改:timeout已添加.
Popen.
send_signal
(signal)-
发出信号signal对孩子
注意
在Windows上,SIGTERM是
terminate()
。CTRL_C_EVENT和CTRL_BREAK_EVENT可以发送到以creationflags参数包括CREATE_NEW_PROCESS_GROUP .
的别名以下属性也可用:
Popen.
args
-
args参数因为它传递给
Popen
– 程序参数的序列或者单个字符串.新版本3.3.
Popen.
stdin
-
如果stdin参数是
PIPE
,此属性是open()
返回的可写流对象。如果指定了encoding或errors参数或universal_newlines参数是True
,则流是文本流,否则它是字节流。如果stdin参数不是PIPE
,则此属性为None
.
Popen.
stdout
-
如果stdout参数为
PIPE
,则此属性为可读流对象由open()
返回。从流中读取提供来自子进程的输出。如果我们指定的encoding或errors参数或universal_newlines参数是True
,流是文本流,否则是字节流。如果stdout参数不是PIPE
,则此属性为None
.
Popen.
stderr
-
如果stderr参数为
PIPE
,则此属性为可读流对象由open()
返回。从子进程读取流提供的错误输出。如果指定了encoding或errors参数或者universal_newlines参数是True
,则流是文本流,否则它是字节流。如果stderr参数不是PIPE
,这个属性是None
.
Popen.
returncode
-
子返回码,由
poll()
和wait()
设置(并间接地communicate()
)。一个None
值表示该过程尚未终止.负值
-N
表示孩子被信号终止N
(仅限POSIX).
Windows Popen Helpers
STARTUPINFO
类和以下常量仅在Windows上可用。
- class
subprocess.
STARTUPINFO
(*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None) -
WindowsSTARTUPINFOstructure的部分支持用于
Popen
创建。可以通过将它们作为仅关键字参数传递来设置以下属性.在版本3.7中更改:添加了仅关键字参数支持.
dwFlags
-
确定的位字段是否在进程创建窗口时使用了某些
STARTUPINFO
属性.si = subprocess.STARTUPINFO()si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
hStdInput
-
如果
dwFlags
指定STARTF_USESTDHANDLES
,则此属性是进程的标准输入句柄。如果没有指定STARTF_USESTDHANDLES
,则标准输入的默认值是键盘缓冲区.
hStdOutput
-
如果
dwFlags
指定STARTF_USESTDHANDLES
,此属性是进程的标准输出句柄。否则,该属性被忽略,标准输出的默认值是控制台窗口的缓冲区.
hStdError
-
如果
dwFlags
指定STARTF_USESTDHANDLES
,此属性是进程的标准错误句柄。否则,此属性被赋值,标准错误的默认值是控制台窗口的缓冲区.
wShowWindow
-
如果
dwFlags
指定STARTF_USESHOWWINDOW
,此属性可以是可以在其中指定的任何值显示窗口函数的nCmdShow
参数,SW_SHOWDEFAULT
除外。否则,此属性isignored.
lpAttributeList
-
时使用它
STARTUPINFOEX
中给出的进程创建的附加属性字典,请参阅参考资料过程说明支持的属性:
- handle_list
-
将继承的句柄序列。close_fds必须是真的ifnon-empty.
句子必须暂时由
os.set_handle_inheritable()
传递到Popen
构造函数,否则OSError
将出现Windows错误ERROR_INVALID_PARAMETER
(87).警告
在多线程进程中,请谨慎使用,以便在将此功能与对继承
os.system()
等句柄的其他进程创建函数的并发调用相结合时,避免泄漏标记为可继承的句柄。这也适用于tostandard handle redirection,它暂时创建了inheritablehandles。
新版本3.7.
Windows Constants
subprocess
模块公开了以下常量。
subprocess.
STD_INPUT_HANDLE
-
标准输入设备。最初,这是控制台输入缓冲区,
CONIN$
.
subprocess.
STD_OUTPUT_HANDLE
-
标准输出设备。最初,这是活动控制台screenbuffer,
CONOUT$
.
subprocess.
STD_ERROR_HANDLE
-
标准错误设备。最初,这是活动控制台屏幕缓冲区,
CONOUT$
.
subprocess.
SW_HIDE
-
隐藏窗口。另一个窗口将被激活.
subprocess.
STARTF_USESTDHANDLES
-
指定
STARTUPINFO.hStdInput
,STARTUPINFO.hStdOutput
和STARTUPINFO.hStdError
属性包含附加信息.
subprocess.
STARTF_USESHOWWINDOW
-
指定
STARTUPINFO.wShowWindow
属性包含附加信息信息
subprocess.
CREATE_NEW_CONSOLE
-
新进程有一个新的控制台,而不是继承其父控制台(默认).
subprocess.
CREATE_NEW_PROCESS_GROUP
-
A
Popen
creationflags
用于指定将创建新进程组的参数。这个标志是在子进程上使用os.kill()
所必需的.如果指定
CREATE_NEW_CONSOLE
则忽略该标志.
subprocess.
ABOVE_NORMAL_PRIORITY_CLASS
-
A
Popen
creationflags
参数指定新进程将具有高于平均值的优先级.新版本3.7.
subprocess.
BELOW_NORMAL_PRIORITY_CLASS
-
A
Popen
creationflags
参数指定新进程的优先级低于平均值.版本3.7.
subprocess.
HIGH_PRIORITY_CLASS
-
A
Popen
creationflags
参数指定新进程将具有高优先级.新版本3.7.
subprocess.
IDLE_PRIORITY_CLASS
-
一个
Popen
creationflags
参数指定一个新进程将具有空闲(最低)优先级.新版本3.7.
subprocess.
NORMAL_PRIORITY_CLASS
-
A
Popen
creationflags
参数to指定新进程将具有正常优先级。(默认)版本3.7.
subprocess.
REALTIME_PRIORITY_CLASS
-
A的新内容
Popen
creationflags
用于指定新进程将具有实时优先级的参数。您几乎从不使用REALTIME_PRIORITY_CLASS,因为此中断系统线程管理鼠标输入,键盘输入和后台磁盘刷新。这个类适用于直接与硬件“对话”或执行应该有限中断的简短任务的应用程序.新版本3.7.
subprocess.
CREATE_NO_WINDOW
-
A
Popen
creationflags
参数to指定一个新进程不会创建一个窗口版本3.7.
subprocess.
DETACHED_PROCESS
-
A
Popen
creationflags
参数指定一个新进程不会继承其父进程控制台。这个值不能是与CREATE_NEW_CONSOLE一起使用新版本3.7.
subprocess.
CREATE_DEFAULT_ERROR_MODE
-
A
Popen
creationflags
参数指定新进程不继承调用进程的错误模式。相反,newprocess获取默认的错误模式。此功能对于禁用硬错误运行的多线程shell应用程序特别有用.版本3.7.
subprocess.
CREATE_BREAKAWAY_FROM_JOB
-
A
Popen
creationflags
参数指定新进程与作业无关.新版本3.7.
旧的高级API
在Python 3.5之前,这三个函数包含高级API tosubprocess。你现在可以在很多情况下使用run()
,但很多现有的代码都会调用这些函数.
subprocess.
call
(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)-
运行args描述的命令。等命令完成,然后返回
returncode
属性这相当于:
run(...).returncode
(除了input和check参数不支持)
上面显示的论点仅仅是最常见的。完整的函数签名在很大程度上与
Popen
构造函数的签名相同 – 此函数传递除timeout直接进入那个界面更改版本3.3:timeout被加上.
subprocess.
check_call
(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None )-
带着争吵的命令。等待命令完成。如果返回码为零则返回,否则提高
CalledProcessError
。CalledProcessError
对象将在returncode
属性中返回代码这相当于:
run(..., check=True)
(除了input不支持参数)
上面显示的参数仅仅是最常见的参数。完整的函数签名与
Popen
构造函数的签名大致相同 – 这个函数将除timeout以外的所有提供的参数直接传递给该接口.更改版本3.3:timeout已添加.
subprocess.
check_output
(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None)-
用参数运行命令并返回其输出.
如果返回码非零,则会引发
CalledProcessError
。CalledProcessError
对象将在returncode
属性和output
属性中的任何输出这相当于:
run(..., check=True, stdout=PIPE).stdout
上面显示的参数仅仅是最常见的参数。完整函数签名大致相同就像
run()
-most参数直接传递给该接口。但是,不支持显式传递input=None
继承父标准输入文件句柄.默认情况下,此函数将数据作为编码字节返回。输出数据的执行编码可能取决于被调用的命令,因此通常需要在应用程序级别处理对文本的解码.
如上所述在universal_newlines中经常使用的参数
True
为了捕获结果中的标准错误,可以通过将设置为.来覆盖此行为,使用
stderr=subprocess.STDOUT
:>>> subprocess.check_output(... "ls non_existent_file; exit 0",... stderr=subprocess.STDOUT,... shell=True)"ls: non_existent_file: No such file or directory\n"
版本3.1.
在版本3.3中更改:timeout已添加.
在版本3.4中更改:添加了对input关键字参数的支持.
更改版本3.6:encoding和errors已添加。见
run()
详情.版本3.7:text新添加为universal_newlines.
更易读的别名用subprocess
模块替换旧函数
在本节中,“a变为b”表示b可以用作替代a
注意
如果找不到执行的程序,则本节中的所有“a”函数都会无声(或多或少)失败;“b”替换提升OSError
instead.
另外,使用check_output()
如果请求的操作产生非零编码代码,则CalledProcessError
将失败。输出仍然可以作为凸起异常的output
属性.
在下面的例子中,我们假设相关函数已经从subprocess
模块导入
更换外壳管道
output=`dmesg | grep hda`
变为:
p1 = Popen(["dmesg"], stdout=PIPE)p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.output = p2.communicate()[0]
启动p2后的p1.stdout.close()调用非常重要,以便p1在p1
或者,对于可信输入,可以直接使用shell自己的管道支持:
output=`dmesg | grep hda`
成为:
output=check_output("dmesg | grep hda", shell=True)
替换os.system()
sts = os.system("mycmd" + " myarg")# becomessts = call("mycmd" + " myarg", shell=True)
注意:
- 通常不需要通过shell调用程序.
更现实的例子如下所示:
try: retcode = call("mycmd" + " myarg", shell=True) if retcode < 0: print("Child was terminated by signal", -retcode, file=sys.stderr) else: print("Child returned", retcode, file=sys.stderr)except OSError as e: print("Execution failed:", e, file=sys.stderr)
更换os.spawn
家族
P_NOWAIT示例:
pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")==>pid = Popen(["/bin/mycmd", "myarg"]).pid
P_WAIT例:
retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")==>retcode = call(["/bin/mycmd", "myarg"])
矢量示例:
os.spawnvp(os.P_NOWAIT, path, args)==>Popen([path] + args[1:])
环境示例:
os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)==>Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
替换os.popen()
, os.popen2()
, os.popen3()
(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)==>p = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True)(child_stdin, child_stdout) = (p.stdin, p.stdout)
(child_stdin, child_stdout, child_stderr) = os.popen3(cmd, mode, bufsize)==>p = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)(child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr)
(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)==>p = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
返回代码处理翻译如下:
pipe = os.popen(cmd, "w")...rc = pipe.close()if rc is not None and rc >> 8: print("There were some errors")==>process = Popen(cmd, stdin=PIPE)...process.stdin.close()if process.wait() != 0: print("There were some errors")
替换popen2
模块中的函数
(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)==>p = Popen("somestring", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True)(child_stdout, child_stdin) = (p.stdout, p.stdin)
(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)==>p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True)(child_stdout, child_stdin) = (p.stdout, p.stdin)
Legacy Shell Invocation Functions
该模块还提供了2.x commands
模块。这些操作隐式调用系统shell,并且上述有关安全性和异常处理一致性的保证都不适用于这些函数.
subprocess.
getstatusoutput
(cmd )-
返回
(exitcode, output)
在shell中执行cmd在cmd的shell中执行字符串
Popen.check_output()
并返回2元组(exitcode, output)
。使用语言环境编码;请参阅经常使用的参数了解更多细节.从输出中删除尾随换行符。该命令的退出代码可以解释为子进程的返回码。例:
>>> subprocess.getstatusoutput("ls /bin/ls")(0, "/bin/ls")>>> subprocess.getstatusoutput("cat /bin/junk")(1, "cat: /bin/junk: No such file or directory")>>> subprocess.getstatusoutput("/bin/junk")(127, "sh: /bin/junk: not found")>>> subprocess.getstatusoutput("/bin/kill $$")(-15, "")
在版本3.3.4中更改:添加了Windows支持.
该函数现在返回(exitcode,output)而不是(状态,输出),就像在Python 3.3.3及更早版本中那样。exitcode与
returncode
.
注意
将参数序列转换为Windows上的字符串
在Windows上,args序列转换为可以使用以下规则解析的字符串(对应于MS Cruntime使用的规则):
- 参数由空格分隔,它是aspace或tab.
- 用双引号括起来的字符串被解释为一个参数,无论其中包含的空格如何。引用的字符串可以嵌入anargument中
- 以反斜杠开头的双引号被解释为文字双引号.
- 按字面解释背斜,除非它们在双引号之前立即执行.
- 如果反斜杠紧跟在双引号之前,则每对反斜杠都被解释为literalbackslash。如果反斜杠的数量是奇数,则lastbackslash会跳过规则3中描述的下一个双引号.
另见
shlex
- 提供解析和转义命令行功能的模块.