Я использую модуль подпроцесса в python для подключения своего 3G-ключа к сети 3G с помощью sakis3g.Управление ошибкой подпроцессора Python. Не удалось поймать ненулевой статус выхода
Смотрите здесь мой код используется:
check_output(['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"'])
Иногда мой ключ может измотать и дать ошибку в природе: «Это устройство не имеет возможности GSM ...»
Который я могу полностью жить, поскольку все, что ему нужно, это просто повторить попытку, и он будет работать нормально.
Однако, используя подпроцессы, я сталкиваюсь с ошибкой returned non-zero exit status
, и это полностью разрушит мое программное обеспечение.
Поскольку все, что мне нужно, это повторить попытку, я попытался ввести код в try: ... except: ...
. Ошибка, которую я пытаюсь поймать, - subprocess.CalledProcessError
, которая должна быть возвращена check_output
в случае отсутствия нулевого статуса выхода в соответствии с the documentation.
Однако, это не похоже, чтобы решить эту проблему, проблема все еще сохраняется:
Traceback (most recent call last):
File "run.py", line 91, in <module>
print connect_3G()
File "run.py", line 28, in connect_3G
check_call(['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"'])
File "/usr/lib/python2.7/subprocess.py", line 540, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"']' returned non-zero exit status 95
Так что я попытался поймать исключение в самом широком образом можно, просто используя except:
и даже если сделать это, ошибка все еще возникает и сбой программного обеспечения.
Я в затруднении, пытаясь поймать эту ошибку должным образом, мог бы кто-нибудь сказать мне, что именно происходит здесь, потому что кажется, что довольно сложно ловить ошибки, вызванные подпроцессами на данный момент (для меня).
Смотрите полную функцию I, предназначенной об использовании здесь:
def connect_3G():
while True:
check_output(['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"'])
try:
return 'Connected to ip: {}'.format(json.loads(requests.get('http://httpbin.org/ip').content)['origin'])
except subprocess.CalledProcessError:
print 'Oops, problem connecting to 3G. Better retry fam.'
Похоже, за исключением выброшен на 'check_output' вызова, который не находится внутри попытки, кроме блока? – strubbly
@strubbly Да, похоже, это проблема, не могу поверить, что я это пропустил! –