我想允许我的程序的用户指定输出是否应该是冗长的。也就是说,正在运行的子进程正在打印它们生成或不生成的所有输出。
我曾经能够做:
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调用加倍的情况下仍实现详细/非详细的区别?
您可以使用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"]
)