2015-10-05 3 views
4

Выполнение следующего сценария ...Python 'подпроцесс' 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: Command '[ping', '-q', '-c2', '-W1', '10.81.3.80 ']' returned non-zero exit status 1

Добавление "Stderr = STDOUT" в check_output не производит никакой полезной обратной связи.

Как получить дополнительную информацию об ошибке, чтобы я мог ее устранить?

ответ

7

subprocess.check_output повышает CalledProcessError на ненулевым кодом завершения, и ping возвращает ненулевой код завершения, если что-то не так (например, неизвестно, доменное имя или сайт вниз или сайт ICMP заблокирован для некоторых причина или подключение к Интернету).

Если вы хотите изучить как выходной и выходной код, использовать 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 
1

Как указано в сообщении об ошибке, ping завершен с нулевым статусом выхода. Это может означать, что, например, предоставленный IP-адрес недоступен или вы не указали неправильные параметры.

С ping страницы человека (http://linux.die.net/man/8/ping):

If ping does not receive any reply packets at all it will exit with code 1. If a packet count and deadline are both specified, and fewer than count packets are received by the time the deadline has arrived, it will also exit with code 1. On other error it exits with code 2. Otherwise it exits with code 0. This makes it possible to use the exit code to see if a host is alive or not.

Вы можете попытаться поймать CalledProcessError и посмотреть, что он содержит в output. Посмотрите здесь https://docs.python.org/2/library/subprocess.html#subprocess.check_output

Смежные вопросы