向stdout提供STDOUT为subprocess.run返回errno9

问题描述 投票:1回答:1

我想允许我的程序的用户指定输出是否应该是冗长的。也就是说,正在运行的子进程正在打印它们生成或不生成的所有输出。

我曾经能够做:

out = subprocess.DEVNULL
if verbose:
   out = subprocess.STDOUT
subprocess.run(['ls','-la'],stderr=out,stdout=out)

但这会导致此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/subprocess.py", line 489, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 9] Bad file descriptor

我能够将错误范围缩小到:

subprocess.run(['ls','-la'],stdout=out)

即,定义应将输出转至标准输出会导致此问题。早期(即<3.8)Python中不是这种情况。

这是设计使然,如何在不使subprocess.run调用加倍的情况下仍实现详细/非详细的区别?

python-3.x subprocess
1个回答
0
投票

您可以使用capture_output选项:

如果capture_output为true,将捕获stdout和stderr。使用时,将使用stdout = PIPE和stderr = PIPE自动创建内部Popen对象。 stdout和stderr参数可能无法与capture_output同时提供。如果要捕获并将两个流合并为一个,请使用stdout = PIPE和stderr = STDOUT而不是capture_output。

subprocess.run(['ls','-la'], capture_output=not verbose)

stdout参数接受None,subprocess.PIPE,文件对象或文件描述符,但不接受subprocess.STD_OUT,这只是一个特殊值,指示stderr应该转到stdout。

如果您希望子进程不打印任何内容并且不保存任何内容,也可以将subprocess.DEVNULL传递给stdout,将subprocess.STDOUT传递给stderr

subprocess.run(
    ["ls", "-la"], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT
)

对于详细模式,您将使用默认值。您也可以将sys.stdout传递到stdout,将subprocess.STDOUT传递给stderr

subprocess.run(
    ["ls", "-la"]
)
© www.soinside.com 2019 - 2024. All rights reserved.