根据subprocess documentation, subprocess.check_output(...) 应返回进程的输出,并引发 CalledProcessError < / em>异常,如果返回代码非零,输出位于 输出 属性中。
如果我尝试使用subprocess.check_output(["ls"])
这样的字符串作为返回值,这很有效。但是,当我尝试
subprocess.check_output(shlex.split("mount -t cifs //server/share /local_rep"))
它直接打印到终端“挂载错误(13):权限被拒绝 请参阅mount.cifs(8)手册页(例如man mount.cifs)“,并且引发的异常的 输出 属性为空 - returncode 和 cmd 已正确设置。
如何设置以便不会将任何内容直接输出到终端,并且错误消息存储在 输出 中?
答案 0 :(得分:1)
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
'most'将其参数直接传递给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
表示“不会发生重定向;子项的文件句柄将从父项继承。”有人注意到subprocess.check_output(...)
没有stdout
作为参数。这是因为stdout
在内部使用 - 即从中获取返回值或 输出 属性。但是,stderr=None
仍然是默认值,这意味着,在这种情况下,错误会直接打印到终端,并且不会被check_output()
选中并返回异常。
一种可能的解决方案是将stderr=subprocess.STDOUT
传递给subprocess.check_output(...)
,以便将错误消息发送到STDOUT
,因此不会打印到终端,并存储在 输出< / em> 如果发生异常。