Python 'subprocess' CalledProcessError : Command '[...]' returned non-zero exit status 1

标签 python subprocess stdout popen

<分区>

正在执行以下脚本...

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: Command '[ping', '-q', '-c2', '-W1', '10.81.3.80 ']' returned non-zero exit status 1

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

如何获取有关错误的更多信息以便进行故障排除?

最佳答案

subprocess.check_output提高 CalledProcessError在非零退出代码上,如果出现问题,ping 返回非零退出代码(例如,未知域名,或网站已关闭,或网站因某种原因被 ICMP 阻止,或您的 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

关于Python 'subprocess' CalledProcessError : Command '[...]' returned non-zero exit status 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32942207/

相关文章:

python - 如何使用 TensorFlow 获得稳定的结果,设置随机种子

php - Web 服务器是否可以响应具有延长时间的输出流的 HTTP 请求?

c - 重定向 shell 中的输入和输出

python - 调整滚动的 Tkinter 文本框的大小

python - 在 Django 的管理器中验证对象属性

python - Python 中子进程 PIPE 的非阻塞读取,一次一个字节

python - 如何正确转义python子进程中的特殊字符?

c# - 如何在进程运行期间逐行捕获进程 STDOUT 和 STDERR。 (C#)

python - Django MTM 字段 : limit_choices_to = other_ForeignKeyField_on_same_model?

python - 您如何简单地更改 Python 脚本以捕获由其自身及其子进程写入 stdout 的所有内容?