This question already has an answer here:
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:
Examples:
As your error message said, ping finished with non zero exit status. It might mean that e.g. the IP address provided is not reachable or you passed in wrong parameters.
From
ping
man page (http://linux.die.net/man/8/ping):You can try to catch
CalledProcessError
and see what it contains inoutput
. Have a look here https://docs.python.org/2/library/subprocess.html#subprocess.check_output