gevent.subprocess --合作社 subprocess 模块#

合作社 subprocess 模块。

小心

在POSIX平台上,此模块不能从主线程以外的本机线程使用;尝试这样做将引发 TypeError . 这个模块依赖于libev的fork watchers。在POSIX系统中,fork监视程序是使用信号实现的,并且是将进程定向信号发送到的线程。 is not defined . 因为每个本机线程都有自己的gevent/libev循环,这意味着注册到一个循环(线程)的fork观察程序可能永远看不到有关它生成的子线程的信号(如果将信号发送到不同的线程)。

备注

此模块的接口旨在与标准库的接口相匹配。 subprocess 模块(从python 3到python 2有许多向后兼容的扩展)。该模块的python 2和python 3版本(python2)之间存在一些小的差异 TimeoutExpired 特别是例外情况扩展了 Timeout 没有 SubprocessError )以及在POSIX和Windows版本之间。此处的HTML文档只能描述一个版本;有关最终文档,请参阅标准库或源代码。

exception CalledProcessError(returncode, cmd, output=None, stderr=None)[源代码]#

基类:SubprocessError

当用check=true调用run()并且进程返回非零退出状态时引发。

属性:

命令,返回代码,stdout,stderr,输出

property stdout#

输出属性的别名,以匹配stderr

exception SubprocessError[源代码]#

基类:Exception

exception TimeoutExpired(cmd, timeout, output=None, stderr=None)[源代码]#

基类:SubprocessError

当等待子进程时超时过期时,会引发此异常。

属性:

命令,输出,stdout,stderr,超时

class CompletedProcess(args, returncode, stdout=None, stderr=None)[源代码]#

基类:object

已完成运行的进程。

这是由run()返回的。

属性:
  • args:传递给run()的列表或str参数。

  • 返回码:进程的退出码,信号为负。

  • 标准输出:标准输出(如果未捕获则无)。

  • stderr:标准错误(如果未捕获,则无)。

在 1.2a1 版本加入: 这首先出现在python 3.5中,并可用于gevent中的所有python版本。

check_returncode()[源代码]#

如果退出代码为非零,则引发CalledProcessError。

class Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=<object object>, 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, group=None, extra_groups=None, user=None, umask=-1, pipesize=-1, process_group=None, threadpool=None)[源代码]#

基类:object

此模块中的底层进程创建和管理由popen类处理。它提供了很大的灵活性,使开发人员能够处理便利功能未涉及的不太常见的情况。

参见

subprocess.Popen 此类应具有与标准库类相同的接口。

小心

某些参数的默认值,特别是 buffering ,在Python2和Python3之间有所不同。为了在不同版本之间实现最一致的行为,最好显式传递所需的值。

小心

在Python 2上, read 的方法。 stdoutstderr 除非明确请求缓冲,否则不会缓冲属性(例如, bufsize=-1). This is different than the read method of the standard library attributes, which will buffer internally even if no buffering has been requested. This matches the Python 3 behaviour. For portability, please explicitly request buffering if you want read(n) to return all n bytes, making more than one system call if needed. See issue 1701 了解更多上下文。

在 1.2a1 版本发生变更: 实例现在可以用作Python2.7下的上下文管理器。以前这只限于Python3。

在 1.2a1 版本发生变更: 实例现在保存 args python 2.7下的属性。以前这只限于Python3。

在 1.2b1 版本发生变更: 添加 encodingerrors python 3的参数。

在 1.3a1 版本发生变更: 接受“类路径”对象 cwd 所有平台上的参数。这是添加到Python3.6中的。以前使用gevent时,它只在3.6上的POSIX平台上工作。

在 1.3a1 版本发生变更: 添加 text 参数作为 universal_newlines ,如在python 3.7中添加的。

在 1.3a2 版本发生变更: 允许在python 2下使用与python 3相同的关键字参数: pass_fdsstart_new_sessionrestore_signalsencodingerrors . 在python 2下, encodingerrors 被忽略,因为使用了通用换行符的本机处理。

在 1.3a2 版本发生变更: 在python 2下, restore_signals 默认为 False . 以前它默认为 True 和在Python3中一样。

在 20.6.0 版本发生变更: 添加 extra_groupsuser乌马斯克 论据。这些都是在python3.9中添加的,但是在任何gevent版本中都可以使用,前提是存在底层平台支持。

在 20.12.0 版本发生变更: 仅在Python2上,如果请求无缓冲的二进制通信, stdin 属性将具有一个 write 方法,该方法实际执行内部缓冲和循环,类似于标准库。它保证在单个调用中写入提供给它的所有数据(但在内部,它可能会进行许多系统调用和/或绕过事件循环来实现这一点)。看见 issue #1711

在 21.12.0 版本发生变更: 添加了 pipesize 与Python3.10兼容的参数。这在所有平台上都被忽略。

在 22.08.0 版本发生变更: 添加了 process_groupcheck 与Python3.11兼容的参数。

communicate(input=None, timeout=None)[源代码]#

与进程交互并返回其输出和错误。

  • 发送 输入 数据到stdin。

  • 从stdout和stderr读取数据,直到到达文件末尾。

  • 等待进程终止。

可选的 输入 参数应该是要发送到子进程的字符串,如果不应该向子进程发送数据,则参数应该是无。

communication()返回一个元组(stdout、stderr)。

参数:

timeout -- 在python 2下,这是一个gevent扩展;如果给定并到期,我们将提升 TimeoutExpired 延伸 gevent.timeout.Timeout (请注意,这只会扩展 BaseExceptionnot Exception )在Python3下,这提高了标准 TimeoutExpired 例外。

在 1.1a2 版本发生变更: 在python 2下,如果 超时 逝去,升起 gevent.timeout.Timeout 例外。以前,我们静静地回来了。

在 1.1b5 版本发生变更: 荣誉A 超时 即使无法与孩子通信(stdin、stdout和stderr不是管道)。

kill()[源代码]#

用sigkill终止进程

pipe_cloexec()[源代码]#

使用fds set cloexec创建管道。

poll()[源代码]#

检查子进程是否已终止。设置并返回 returncode 属性。

send_signal(sig)[源代码]#

向进程发送信号

terminate()[源代码]#

用sigterm终止进程

wait(timeout=None, _raise_exc=True)[源代码]#

等待子进程终止。退换商品 returncode 属性。

参数:

timeout -- 等待的浮点秒数。在python 2下,这是一个gevent扩展,如果它过期,我们只返回它。在python 3下,如果这段时间过去了而没有完成这个过程, TimeoutExpired 提高了。

call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None) returncode[源代码]#

带参数运行命令。等待命令完成或超时,然后返回返回代码属性。

参数与popen构造函数相同。例子::

retcode = call(["ls", "-l"])

在 1.2a1 版本发生变更: 这个 timeout 关键字参数现在在所有支持的python版本(不仅仅是python 3)上都被接受,如果它过期,将引发 TimeoutExpired 异常(在python 2下,这是 Timeout

check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None) 0[源代码]#

带参数运行命令。等待命令完成。如果退出代码为零,则返回,否则引发 CalledProcessError . 这个 CalledProcessError 对象将在返回代码属性中包含返回代码。

参数与popen构造函数相同。例子::

retcode = check_call(["ls", "-l"])
check_output(args, *, input=None, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None) output[源代码]#

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

如果退出代码为非零,则会引发 CalledProcessError . 这个 CalledProcessError 对象将在返回代码属性中具有返回代码,在输出属性中具有输出。

参数与popen构造函数相同。例子::

>>> check_output(["ls", "-1", "/dev/null"])
'/dev/null\n'

这个 stdout 不允许使用参数,因为它在内部使用。

要捕获结果中的标准错误,请使用 stderr=STDOUT ::

>>> output = check_output(["/bin/sh", "-c",
...               "ls -l non_existent_file ; exit 0"],
...              stderr=STDOUT).decode('ascii').strip()
>>> print(output.rsplit(':', 1)[1].strip())
No such file or directory

还有一个附加的可选参数“input”,允许您将字符串传递给子进程的stdin。如果使用此参数,则不能同时使用popen构造函数的“stdin”参数,因为它也将在内部使用。例子::

>>> check_output(["sed", "-e", "s/foo/bar/"],
...              input=b"when in the course of fooman events\n")
'when in the course of barman events\n'

如果 universal_newlines=True 如果传递,则返回值将是字符串而不是字节。

在 1.2a1 版本发生变更: 这个 timeout 关键字参数现在在所有支持的python版本(不仅仅是python 3)上都被接受,如果它过期,将引发 TimeoutExpired 异常(在python 2下,这是 Timeout

在 1.2a1 版本发生变更: 这个 input 现在,所有支持的python版本都接受关键字参数,而不仅仅是python 3。

在 22.08.0 版本发生变更: 通过了 check 关键字参数被禁止,就像在Python3.11中一样。

getoutput(cmd, *, encoding=None, errors=None)[源代码]#

返回在shell中执行cmd的输出(stdout或stderr)。

与getStatusOutput()类似,只是退出状态被忽略,返回值是包含命令输出的字符串。例子:

>>> import subprocess
>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'
getstatusoutput(cmd, *, encoding=None, errors=None)[源代码]#

在shell中执行cmd的返回(exitcode,output)。

在带有“check_output”的shell中执行字符串“cmd”,并返回2元组(status,output)。区域设置编码用于解码输出并处理换行。

从输出中去除尾随换行符。可以根据函数“wait”的规则解释命令的退出状态。例子:

>>> import subprocess
>>> 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, '')
run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False) CompletedProcess[源代码]#

用参数运行命令并返回一个完成的进程实例。

返回的实例将具有属性args、returncode、stdout和stderr。默认情况下,不会捕获stdout和stderr,这些属性将为none。传递stdout=pipe和/或stderr=pipe以捕获它们。如果check为true且退出代码为非零,则会引发一个被调用的ProcessError。CalledProcessError对象将在返回代码属性中包含返回代码,如果捕获了这些流,则输出&stderr属性。

如果超时,并且进程花费的时间太长,则将引发TimeoutExpired异常。

有一个可选参数“input”,允许您将字符串传递给子进程的stdin。如果使用此参数,则不能同时使用popen构造函数的“stdin”参数,因为它将在内部使用。其他参数与popen构造函数相同。如果传递universal_newlines=true,则“input”参数必须是字符串,并且返回对象中的stdout/stderr将是字符串而不是字节。

在 1.2a1 版本加入: 这个函数首先出现在Python3.5中。它在所有Python版本的gevent支持上都可用。

在 1.3a2 版本发生变更: 添加 capture_output python 3.7中的参数。它会自动设置 stdoutstderrPIPE . 将这些参数中的任何一个与 capture_output .