使用subprocess.check_output()调用时将打印挂载到终端

时间:2016-04-18 21:36:35

标签: python subprocess mount

根据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 已正确设置。

如何设置以便不会将任何内容直接输出到终端,并且错误消息存储在 输出 中?

1 个答案:

答案 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> 如果发生异常。