Python'subprocess'CalledProcessError:命令'[...]'返回非零退出状态1
执行以下脚本...
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
CalledProcessError: Command '[ping', '-q', '-c2', '-W1', '10.81.3.80 ']' returned non-zero exit status 1
在check_output
中添加"stderr = STDOUT"不会产生任何有用的反馈.
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 在非零退出代码上引发 CalledProcessError ,而ping
返回非如果出现错误(例如,未知域名,站点关闭,站点由于某种原因而阻止了ICMP或您的Internet连接关闭),则退出代码为零.
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).
如果您要检查输出代码和退出代码,请使用 subprocess.Popen :
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())
示例:
$ 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