首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >check_call,如果它失败了,它会以本地的方式打印STDERR吗?

check_call,如果它失败了,它会以本地的方式打印STDERR吗?
EN

Stack Overflow用户
提问于 2022-03-09 08:59:43
回答 1查看 139关注 0票数 1

我经常希望执行subprocess.check_output的操作,即打印STDOUT,并在退出时检查返回代码为0。但是,如果有错误,我希望STDERR被打印。当查看日志文件和仅仅看到返回代码时,通常并不是很有好处。

例如:

代码语言:javascript
运行
复制
subprocess.check_call(['ping', '-c', '1', 'github.com2'])

将产生此错误:

代码语言:javascript
运行
复制
subprocess.CalledProcessError: Command '['ping', '-c', '1', 'github.com2']' returned non-zero exit status 2.

在这里,我们想知道为什么它失败了,在现实世界的例子中,能够看到实际错误是什么变得非常关键。因此,我发现我总是必须将这样的调用包装在这样的东西中,才能看到STDERR:

代码语言:javascript
运行
复制
import subprocess
cmds = ['ping', '-c', '1', 'github.com2']
result = subprocess.run(cmds, stderr=subprocess.PIPE)
if result.returncode != 0:
    msg = result.stderr.decode().strip()
    raise subprocess.CalledProcessError(f"CALLED SUBPROCESS ERROR: Command: {' '.join(cmds)}\nReturn code {result.returncode}\nSTDERR: {msg}\n")

通过上面的内容,我们可以看到STDERR是:

代码语言:javascript
运行
复制
ping: github.com2: Temporary failure in name resolution

我觉得一定有一个内置的方式使用子进程,但无法弄清楚。

我猜这是不可能的,因为CalledSubprocessError不使用STDERR是异常的字符串版本:

代码语言:javascript
运行
复制
class CalledProcessError(SubprocessError):
    """Raised when run() is called with check=True and the process
    returns a non-zero exit status.

    Attributes:
      cmd, returncode, stdout, stderr, output
    """
    def __init__(self, returncode, cmd, output=None, stderr=None):
        self.returncode = returncode
        self.cmd = cmd
        self.output = output
        self.stderr = stderr

    def __str__(self):
        if self.returncode and self.returncode < 0:
            try:
                return "Command '%s' died with %r." % (
                        self.cmd, signal.Signals(-self.returncode))
            except ValueError:
                return "Command '%s' died with unknown signal %d." % (
                        self.cmd, -self.returncode)
        else:
            return "Command '%s' returned non-zero exit status %d." % (
                    self.cmd, self.returncode)

    @property
    def stdout(self):
        """Alias for output attribute, to match stderr"""
        return self.output

    @stdout.setter
    def stdout(self, value):
        # There's no obvious reason to set this, but allow it anyway so
        # .stdout is a transparent alias for .output
        self.output = value
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-10 07:29:05

调用subprocess.run(..., check=True)应该提供所有所需的信息。来自手册:“如果检查为真,并且进程退出时有一个非零的退出代码,则会引发一个手册异常。如果捕获了参数、退出代码以及stdout和stderr,则该异常的属性保留参数、退出代码以及stdout和stderr。”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71406698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档