【问题标题】:mount printing to terminal when called with subprocess.check_output()使用 subprocess.check_output() 调用时将打印安装到终端
【发布时间】:2016-08-10 19:48:41
【问题描述】:

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

如果我尝试像subprocess.check_output(["ls"]) 这样我将字符串作为返回值,这会很好。但是,当我尝试

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

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

【问题讨论】:

    标签: python subprocess mount


    【解决方案1】:
    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 表示“不会发生重定向;子文件句柄将从父文件继承。”有人会注意到 subprocess.check_output(...) 没有 stdout 作为参数。这是因为stdout 是在内部使用的——这就是返回值或 output 属性的来源。但是,stderr=None 仍然是默认值,这意味着在这种情况下,错误会直接打印到终端,不会被check_output() 拾取并返回异常。

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

    【讨论】:

    • -1 你为什么问这个问题并发布一个自我回答?其中没有新信息,只需阅读stderrstdout 上的文档,例如在check_output 部分 -> 要同时捕获结果中的标准错误,请使用 stderr=subprocess.STDOUT
    • 我在写问题的时候想出了答案;想我不妨把它贴出来,有人会在某些时候发现它有用。事后看来,这是一个非常明显的答案,但是错过了那条线,我并不清楚,还假设默认的 stdin/stdout/stderr=None 意味着它是在内部处理的,而不是从父进程继承的。
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2013-06-27
    • 2013-09-14
    相关资源
    最近更新 更多