首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查CalledProcessError的输出

检查CalledProcessError的输出
EN

Stack Overflow用户
提问于 2011-09-27 20:32:44
回答 6查看 132.5K关注 0票数 55

我正在使用pythons子进程模块的subprocess.check_output来执行ping命令。我就是这样做的:

代码语言:javascript
运行
复制
output = subprocess.check_output(["ping","-c 2 -W 2","1.1.1.1")

它正在引发一个CalledProcessError,并表示输出是函数的参数之一。有人能帮我看一下输出结果吗。我希望将输出读入字符串并解析它。例如,如果ping返回

100%丢包

我要抓住这个。如果还有其他更好的,way..please建议。谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-27 20:39:26

在参数列表中,每个条目必须是独立的。使用

代码语言:javascript
运行
复制
output = subprocess.check_output(["ping", "-c","2", "-W","2", "1.1.1.1"])

应该能解决你的问题。

票数 21
EN

Stack Overflow用户

发布于 2011-11-22 23:05:48

根据Python os模块文档的说法,从Python2.6开始,os.popen就被废弃了。

我认为现代Python的解决方案是从子流程模块中使用check_output()。

来自子进程Python文档

subprocess.check_output(args,*,stdin=None,stderr=None,shell=False,universal_newlines=False)运行带有参数的命令,并以字节字符串的形式返回其输出。 如果返回代码为非零,则会引发CalledProcessError。CalledProcessError对象将在返回代码属性中有返回代码,在输出属性中有任何输出。

如果您在Python2.7(或更高版本)中运行以下代码:

代码语言:javascript
运行
复制
import subprocess

try:
    print subprocess.check_output(["ping", "-n", "2", "-w", "2", "1.1.1.1"])
except subprocess.CalledProcessError, e:
    print "Ping stdout output:\n", e.output

您应该会看到如下所示的输出:

代码语言:javascript
运行
复制
Ping stdout output:

Pinging 1.1.1.1 with 32 bytes of data:
Request timed out.
Request timed out.

Ping statistics for 1.1.1.1:
Packets: Sent = 2, Received = 0, Lost = 2 (100% loss),

可以解析e.output字符串以满足操作需要。

如果您想要返回代码或其他属性,它们在CalledProccessError中,这可以通过使用pdb来看到。

代码语言:javascript
运行
复制
(Pdb)!dir(e)   

['__class__', '__delattr__', '__dict__', '__doc__', '__format__',
 '__getattribute__', '__getitem__', '__getslice__', '__hash__', '__init__',
 '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
 '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', 
 '__unicode__', '__weakref__', 'args', 'cmd', 'message', 'output', 'returncode']
票数 169
EN

Stack Overflow用户

发布于 2017-11-08 17:18:51

如果您希望获得stdout和stderr返回(包括在发生事件时从CalledProcessError中提取它),请使用以下方法:

代码语言:javascript
运行
复制
import subprocess

def call_with_output(command):
    success = False
    try:
        output = subprocess.check_output(command, stderr=subprocess.STDOUT).decode()
        success = True 
    except subprocess.CalledProcessError as e:
        output = e.output.decode()
    except Exception as e:
        # check_call can raise other exceptions, such as FileNotFoundError
        output = str(e)
    return(success, output)

call_with_output(["ls", "-l"])

这是与Python 2和3兼容的。

如果您的命令是字符串而不是数组,请将其前缀为:

代码语言:javascript
运行
复制
import shlex
call_with_output(shlex.split(command))
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7575284

复制
相关文章

相似问题

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