You are here:  Home » Python » – 子进程管理 – 并发执行(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=PIPEstderr=PIPE自动创建对象。stdoutstderr参数也可能不被使用.

timeout参数传递给Popen.communicate()。如果timeoutexpires,子进程将被终止并等待。在子进程终止后,TimeoutExpired异常将被重新提升.

input参数传递给Popen.communicate()并因此传递给子进程的stdin。如果使用它必须是字节序列,或者如果指定encodingerrors或者text为真,则为字符串。使用时,内部Popen使用stdin=PIPE自动创建对象,并且stdin参数也可能不被使用.

如果check为真,则进程退出非零退出代码,将引发CalledProcessError异常。thatexception的属性包含参数,退出代码,stdout和stderr,如果它们被捕获的话.

如果指定encodingerrors,或text是true,stdin,stdout和stderr的文件对象在文本模式下使用指定的encodingerrorsio.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:添加了encodingerrors参数

在版本3.7中更改:添加了text参数,作为universal_newlines更易理解的别名。添加了capture_output参数

class subprocess.CompletedProcess

来自run()的返回值,表示已完成的进程.

args

用于启动进程的参数。这可能是一个列表或一个字符串.

returncode

退出子进程的状态。通常,退出状态为0表示它成功运行.

负值-N表示孩子被信号终止N(仅限POSIX).

stdout

从子进程捕获的stdout。一个字节序列,或一个字符串,如果run()被调用,带有编码,错误或text = True .None如果没有捕获stdout .

如果你运行了这个过程使用stderr=subprocess.STDOUT,stdout和stder将合并到这个属性中,stderrNone.

stderr

从子进程中捕获stderr。一个字节序列,或一个字符串,如果run()被调用,编码,错误或文本=真.None如果没有捕获stderr.

check_returncode(

如果returncode非零,请在版本3.5中添加CalledProcessError.

新增.

subprocess.DEVNULL

可用作stdin, stdoutstderr参数Popen的特殊值,表示将使用特殊文件os.devnull .

版本3.3.

subprocess.PIPE

中的新功能可用作stdin, stdoutstderr参数Popen并表示应打开标准流的管道。对Popen.communicate().

subprocess.STDOUT

最有用的特殊值可以用作stderrPopen并指示标准错误应该与标准输出相同的句柄.

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中更改:stdoutstderr属性添加

exception subprocess.CalledProcessError

的子类SubprocessError,当一个进程由check_call()要么 check_output()返回非零退出状态.

returncode

退出子进程的状态。如果由于信号过程退出,这将是负信号.

cmd

用于生成子进程的命令.

output

如果run()check_output()捕获了子进程的输出。否则,None.

stdout

输出的别名,与stderr.

stderr

子进程的Stderr输出如果被run()捕获。否则,None.

在版本3.5中更改:stdoutstderr属性添加

常用的参数

为了支持各种各样的用例,Popen构造函数(和便捷函数)接受大量可选参数。对于大多数典型的用例,许多这些参数可以安全地保留在其默认值。最常需要的论据是:

args所有调用都需要它,并且应该是一个字符串或一系列程序参数。提供一系列参数通常是优选的,因为它允许模块处理任何所需的转义和引用参数(例如,允许文件名中的空格)。如果传递单个字符串,shell必须是True(见下文)或者字符串必须简单地命名要执行的程序而不指定任何参数.

stdin, stdoutstderr分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为PIPE, DEVNULL,现有文件描述符(正整数),现有文件对象,以及None. PIPE表示应创建到子节点的新管道。DEVNULL表示将使用特殊文件os.devnull。使用None的默认设置,不会发生重定向;子项的文件句柄将从父项继承。另外,stderr可以STDOUT,表示来自子进程的stderr数据应该被捕获到与stdout.

相同的文件句柄中。如果指定了encodingerrors,或者text(也称为universal_newlines)是真的,文件对象stdin, stdoutstderr将在文本模式中使用encodingerrors打开在io.TextIOWrapper.

的调用或默认值中指定对于stdin,输入中的行结束字符"\n"将被转换为默认行分隔符os.linesep。对于stdoutstderr,输出中的所有行结尾都将转换为"\n"。有关更多信息,请参阅io.TextIOWrapper类的文档,其构造函数的newline参数是None.

如果没有使用文本模式,stdin, stdoutstderr将打开asbinary streams。没有执行编码或行结束转换.

新版本3.6:添加了encodingerrors参数

新版本3.7:添加了text参数作为universal_newlines.

的别名注意

文件对象的新行属性Popen.stdin,Popen.stdoutPopen.stderr没有更新Popen.communicate()方法

// shellTrue,指定的命令将通过shell执行。如果您主要使用Python来提供它在大多数系统shell上提供的增强控制流,并且仍然希望方便地访问其他shell功能,例如shell管道,filenamewildcards,环境变量扩展和~到auser的主目录。但是,请注意Python本身提供了许多类似shell的功能的实现(特别是glob,fnmatch, os.walk(), os.path.expandvars(),os.path.expanduser(),和shutil).

改版3.3:什么时候 universal_newlinesTrue,该类使用编码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上,该类使用Windows CreateProcess()功能。Popen的参数如下:

args应该是程序参数序列或者是单个字符串。默认情况下,要执行的程序是args中的第一项如果args是一个序列。如果args是一个字符串,则解释依赖于平台并在下面描述。有关与默认行为的其他差异,请参阅shellexecutable参数。除非另有说明,否则建议将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作为要执行的程序。如果shellTrue,建议通过args作为一个字符串而不是一个序列.

在POSIX上shell=True,shell默认为/bin/sh。如果args是一个字符串,则该字符串指定通过shell执行的命令。这意味着必须格式化字符串,就像在shell提示符下键入时一样。这包括,例如,引用或反斜杠转义带有空格的文件名。如果args是一个序列,则第一个项指定命令字符串,并且任何其他项将被视为shellitself的附加参数。也就是说,Popen相当于:

Popen(["/bin/sh", "-c", args[0], args[1], ...])

在带shell=TrueWindows上,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, stdoutstderr指定执行程序的标准输入,标准输出和标准错误文件分别处理。有效值是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, 12之外的所有文件描述符都将在孩子面前关闭进程被执行。否则close_fds是假的,文件描述符服从中描述的继承标志//文件描述符的继承.

在Windows上,如果close_fds如果是,则除非在handle_listSTARTUPINFO.lpAttributeList元素中显式传递,或者通过标准句柄重定向传递,否则子进程不会继承句柄.

更改版本3.2:的默认值close_fds从改变了False如上所述.

更改版本3.7:在Windows上,close_fds从改变了FalseTrue重定向标准手柄时。它现在可以设置close_fdsTrue重定向标准手柄时

pass_fds是一个可选的文件描述符序列,用于在父级和子级之间保持打开状态。提供任何pass_fdsclose_fdsTrue。(仅限POSIX)

版本3.2中新增: pass_fds参数被添加

如果cwd不是None,函数在执行子进程之前将工作目录更改为cwdcwd可以是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.

如果encodingerrors被指定,或text为真,文件对象stdin, stdoutstderr在文本模式下打开,带有specificiedencoding和errors,如上所述经常使用的参数.universal_newlines参数相当于text并提供向后兼容性。默认情况下,文件对象以二进制模式打开.

版本3.6中新增:encodingerrors添加。

版本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中更改:添加了上下文管理器支持.

版本3.6更改:如果子进程仍在运行,Popen析构函数现在会发出ResourceWarning警告

Exceptions

在新程序开始执行之前,子进程中引发的异常将在父进程中重新提升.

提出的最常见的例外是OSError。例如,在尝试执行不存在的文件时会发生这种情况。应用程序应该准备OSErrorexceptions.

一个 ValueError如果Popen调用无效参数

check_call()如果被调用的进程返回一个非零的返回码,则check_output()将引发CalledProcessError

所有接受timeout参数的函数和方法,如如call()Popen.communicate()会举起TimeoutExpired如果超时在进程退出之前到期.

此模块中定义的异常全部继承自SubprocessError.

版本3.3中的新增内容:添加了SubprocessError基类.

安全注意事项

与其他一些popen函数不同,此实现永远不会轻易调用系统shell。这意味着所有字符(包括shell元字符)都可以安全地传递给子进程。如果通过shell=True显式调用shell,则应用程序负责确保所有空格和元字符被适当地引用以避免出现问题injectionvul​​nerabilities.

使用shell=True时,可以使用shlex.quote()函数来正确地转义将用于构造shell命令的字符串中的空格和shell元字符.

Popen Objects

Popen类的实例有以下方法:

Popen.poll

检查子进程是否有终止。设置并返回returncode属性。否则,返回None.

Popen.waittimeout=None

等待子进程终止。设置并返回returncode属性

如果进程在timeout秒后没有终止,则引发TimeoutExpired异常。抓住这个例外是安全的并且重新等待.

注意

使用stdout=PIPEstderr=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_signalsignal

发出信号signal对孩子

注意

Windows上,SIGTERM是terminate()。CTRL_C_EVENT和CTRL_BREAK_EVENT可以发送到以creationflags参数包括CREATE_NEW_PROCESS_GROUP .

Popen.terminate

阻止孩子。在Posix OS上,该方法将SIGTERM发送给子节点。在Windows上,调用Win32 API函数TerminateProcess()来阻止孩子.

Popen.kill ()

杀死孩子。在Posix操作系统上,该函数将SIGKILL发送给子。在Windows上kill()terminate().

的别名以下属性也可用:

Popen.args

args参数因为它传递给Popen – 程序参数的序列或者单个字符串.

新版本3.3.

Popen.stdin

如果stdin参数是PIPE,此属性是open()返回的可写流对象。如果指定了encodingerrors参数或universal_newlines参数是True,则流是文本流,否则它是字节流。如果stdin参数不是PIPE,则此属性为None.

Popen.stdout

如果stdout参数为PIPE,则此属性为可读流对象由open()返回。从流中读取提供来自子进程的输出。如果我们指定的encodingerrors参数或universal_newlines参数是True,流是文本流,否则是字节流。如果stdout参数不是PIPE,则此属性为None.

Popen.stderr

如果stderr参数为PIPE,则此属性为可读流对象由open()返回。从子进程读取流提供的错误输出。如果指定了encodingerrors参数或者universal_newlines参数是True,则流是文本流,否则它是字节流。如果stderr参数不是PIPE,这个属性是None.

警告

使用communicate()而不是.stdin.write,.stdout.read.stderr.read避免由于任何其他OS管道缓冲区填满并阻塞子进程而导致的死锁.

Popen.pid

子进程的进程ID .

请注意,如果你设置shell True的参数,这是生成的shell的进程ID。

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.

SW_HIDE是为此属性提供的。使用Popen调用shell=True.

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.hStdOutputSTARTUPINFO.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

(除了inputcheck参数不支持)

上面显示的论点仅仅是最常见的。完整的函数签名在很大程度上与Popen构造函数的签名相同 – 此函数传递除timeout直接进入那个界面

注意

不使用 stdout=PIPE要么 stderr=PIPE有这个功能。子进程将阻塞,如果它为管道生成足够的输出以填充OS管道缓冲区,因为没有读取管道.

更改版本3.3:timeout被加上.

subprocess.check_call (args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None )

带着争吵的命令。等待命令完成。如果返回码为零则返回,否则提高CalledProcessErrorCalledProcessError对象将在returncode属性中返回代码

这相当于:

run(..., check=True)

(除了input不支持参数)

上面显示的参数仅仅是最常见的参数。完整的函数签名与Popen构造函数的签名大致相同 – 这个函数将除timeout以外的所有提供的参数直接传递给该接口.

注意

请勿使用stdout=PIPEstderr=PIPE此功能。子进程将阻塞,如果它为管道生成足够的输出以填充OS管道缓冲区,因为没有读取管道.

更改版本3.3:timeout已添加.

subprocess.check_outputargs, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None

用参数运行命令并返回其输出.

如果返回码非零,则会引发CalledProcessErrorCalledProcessError对象将在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:encodingerrors已添加。见run()详情.

版本3.7:text新添加为universal_newlines.

更易读的别名用subprocess模块替换旧函数

在本节中,“a变为b”表示b可以用作替代a

注意

如果找不到执行的程序,则本节中的所有“a”函数都会无声(或多或少)失败;“b”替换提升OSErrorinstead.

另外,使用check_output()如果请求的操作产生非零编码代码,则CalledProcessError将失败。输出仍然可以作为凸起异常的output属性.

在下面的例子中,我们假设相关函数已经从subprocess模块导入

Replacing / bin / sh shell反引用

output=`mycmd myarg`

成为:

output = check_output(["mycmd", "myarg"])

更换外壳管道

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模块中的函数

注意

如果popen2函数的cmd参数是字符串,则命令通过/ bin / sh执行。如果是列表,则直接执行命令.

(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)

popen2.Popen3popen2.Popen4基本上用作subprocess.Popen,除了:

  • Popen如果执行失败则引发异常.
  • capturestderr参数被stderr参数替换.
  • stdin=PIPEstdout=PIPE必须指定.
  • popen2默认关闭所有文件描述符,但你必须用close_fds=True指定Popen以保证在所有平台或过去的Python版本上都有这种行为.

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, "")

可用性:POSIX&amp;Windows.

在版本3.3.4中更改:添加了Windows支持.

该函数现在返回(exitcode,output)而不是(状态,输出),就像在Python 3.3.3及更早版本中那样。exitcode与returncode.

subprocess.getoutputcmd

shell中执行cmd的返回输出(stdout和stderr)具有相同的值

//喜欢getstatusoutput(),除了退出代码被忽略,returnvalue是一个包含命令输出的字符串。示例:

>>> subprocess.getoutput("ls /bin/ls")"/bin/ls"

可用性:POSIX&amp;Windows.

更改版本3.3.4: Windows支持添加

注意

将参数序列转换为Windows上的字符串

在Windows上,args序列转换为可以使用以下规则解析的字符串(对应于MS Cruntime使用的规则):

  1. 参数由空格分隔,它是aspace或tab.
  2. 用双引号括起来的字符串被解释为一个参数,无论其中包含的空格如何。引用的字符串可以嵌入anargument中
  3. 以反斜杠开头的双引号被解释为文字双引号.
  4. 按字面解释背斜,除非它们在双引号之前立即执行.
  5. 如果反斜杠紧跟在双引号之前,则每对反斜杠都被解释为literalbackslash。如果反斜杠的数量是奇数,则lastbackslash会跳过规则3中描述的下一个双引号.

另见

shlex
提供解析和转义命令行功能的模块.