使用 subprocess.check_output() 调用时将打印安装到终端

mount printing to terminal when called with subprocess.check_output()

根据 subprocess documentationsubprocess.check_output(...) 应该 return进程的输出,如果 return 代码不为零,则引发 CalledProcessError 异常,输出在 output 中 属性。

如果我尝试 subprocess.check_output(["ls"]) 之类的方法,我将字符串作为 return 值,则效果很好。但是,当我尝试

subprocess.check_output(shlex.split("mount -t cifs //server/share /local_rep"))

直接打印到终端"mount error(13): Permission denied 请参阅 mount.cifs(8) 手册页(例如 man mount.cifs)"output 引发的异常的属性为空 - returncodecmd设置正确。

我怎样才能做到不直接向终端输出任何内容,并将错误消息存储在output中?

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

'mostly' 将其参数直接传递给 Popen 构造函数:

class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0),

默认值 stdin/stdout/stderr=None 表示 "no redirection will occur; the child's file handles will be inherited from the parent." 有人会注意到 subprocess.check_output(...) 没有 stdout 作为参数。这是因为 stdout 在内部使用 - 即 return 值或 output 属性的来源。但是,stderr=None 仍然是默认值,这意味着,在这种情况下,错误会直接打印到终端,而不会被 check_output() 和 return 异常拾取。

一个可能的解决方案是将 stderr=subprocess.STDOUT 传递给 subprocess.check_output(...),以便将错误消息发送到 STDOUT,因此不会打印到终端,并存储在 输出以防异常.