【问题标题】:Python 'subprocess' CalledProcessError: Command '[...]' returned non-zero exit status 1 [duplicate]Python'subprocess'CalledProcessError:命令'[...]'返回非零退出状态1 [重复]
【发布时间】:2016-01-01 17:34:24
【问题描述】:

正在执行以下脚本...

import socket                   
import sys                          

from collections import OrderedDict
from subprocess import check_output
from threading import Thread    

[...]

class IpCheck(Thread):  

    RECEIVED_PACKAGES_RE = re.compile(r'(\d+) received')

    def __init__(self, ip):                         
        Thread.__init__(self)
        self.ip = ip
        self.result = None

    def run(self):                          
        match = self.RECEIVED_PACKAGES_RE.search(
            check_output(['ping', '-q', '-c2', '-W1', self.ip])
        )

        successful_ping_count = int(match.group(1)) if match else 0

        if successful_ping_count == 0:
            self.result = 'no response'
        elif successful_ping_count == 1:
            self.result = 'alive, but 50% package loss'
        elif successful_ping_count == 2:
            self.result = check_snmp(self.ip)
        else:
            assert False

[...]

...导致错误:

CalledProcessError:命令 '[ping', '-q', '-c2', '-W1', '10.81.3.80 ']' 返回非零退出状态 1

check_output 中添加“stderr = STDOUT”并没有产生任何有用的反馈。

如何获取有关错误的更多信息以便解决问题?

【问题讨论】:

    标签: python subprocess stdout popen


    【解决方案1】:

    subprocess.check_output 在非零退出代码上引发 CalledProcessError,如果出现错误(例如,未知域名、站点已关闭或站点因某种原因 ICMP 被阻止),ping 返回非零退出代码,或您的 Internet 连接已断开)。

    如果您想检查输出和退出代码,请使用subprocess.Popen

    import subprocess
    import sys
    
    site = sys.argv[1]
    ping_count = 4
    process = subprocess.Popen(['ping', site, '-c', str(ping_count)],
                               stdout=subprocess.PIPE,
                               stderr=subprocess.STDOUT)
    returncode = process.wait()
    print('ping returned {0}'.format(returncode))
    print(process.stdout.read())
    

    例子:

    $ python ping.py google.com         <-- ping successful
    ping returned 0
    PING google.com (195.64.213.27) 56(84) bytes of data.
    64 bytes from cache.google.com (195.64.213.27): icmp_seq=1 ttl=57 time=59.8 ms
    64 bytes from cache.google.com (195.64.213.27): icmp_seq=2 ttl=57 time=2.43 ms
    64 bytes from cache.google.com (195.64.213.27): icmp_seq=3 ttl=57 time=77.0 ms
    64 bytes from cache.google.com (195.64.213.27): icmp_seq=4 ttl=57 time=43.8 ms
    
    --- google.com ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3004ms
    rtt min/avg/max/mdev = 2.439/45.802/77.096/27.658 ms
    
    $ python ping.py asdasdas.com       <-- DNS resolved, but site is down
    ping returned 1
    PING asdasdas.com (69.172.201.208) 56(84) bytes of data.
    
    --- asdasdas.com ping statistics ---
    4 packets transmitted, 0 received, 100% packet loss, time 3024ms
    
    $ python ping.py asdasdasdasda.com  <-- DNS failed
    ping returned 2
    ping: unknown host asdasdasdasda.com
    

    【讨论】:

      【解决方案2】:

      正如您的错误消息所说,ping 以非零退出状态完成。这可能意味着例如提供的 IP 地址不可访问或您传入了错误的参数。

      来自ping 手册页 (http://linux.die.net/man/8/ping):

      如果 ping 根本没有收到任何回复数据包,它将以代码 1 退出。如果同时指定了数据包计数和截止时间,并且在截止时间到达时收到的数据包少于计数,它也会以代码 1 退出代码 1。在其他错误时,它以代码 2 退出。否则,它以代码 0 退出。这使得可以使用退出代码来查看主机是否处于活动状态。

      您可以尝试捕获CalledProcessError 并查看output 中包含的内容。 看看这里https://docs.python.org/2/library/subprocess.html#subprocess.check_output

      【讨论】:

        猜你喜欢
        • 2021-02-15
        • 2016-07-11
        • 1970-01-01
        • 2021-01-11
        • 2014-04-09
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多