Executing the following script...

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

[...]

... results in an error:

CalledProcessError: Command '[ping', '-q', '-c2', '-W1', '10.81.3.80 ']' returned non-zero exit status 1

Adding "stderr = STDOUT" in check_output did not produce any useful feedback.

How can I obtain more information regarding the error so that I can troubleshoot it?

解决方案

subprocess.check_output raises CalledProcessError on non-zero exit code, and ping returns non-zero exit code if something is wrong (e.g. unknown domain name, or site is down, or site has ICMP blocked for some reason, or your Internet connection is down).

If you want to examine both output and exit code, use 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())

Examples:

$ python ping.py google.com

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

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

ping returned 2

ping: unknown host asdasdasdasda.com

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐