Hinzufügen timeout im Teilprozess.check_output
Ich entwickle ein kleines tool in Python 2.7 und mit subprocess-Modul. Ich bin mit diesem Modul zum ausführen von Befehlen auf remote-Geräten erfolgt über die check_output
Funktion. Es könnte eine situation, in der das remote-Gerät nicht funktioniert und somit bin ich immer die folgende Antwort:
Timeout: No Response from 10.xxx.xxx.xxx
Folgendes ist mein code:
try:
x=subprocess.check_output(command, shell=True)
except Exception:
print ("Some issues in fetching details")
exit()
else:
print (x)
Will ich timeout in dieser Funktion, so dass, wenn nach einer gewissen Zeit keine Antwort eingegangen ist, mein code geht im Exception-Teil und druckt die angegebene Nachricht. Ich habe versucht, mit timeout-argument in der check_output
Befehl aber nach dem ausführen meines scripts mit timeout-argument, es ist sofort drucken der Nachricht in der Exception-Teil.
Was habe ich versucht:
try:
x=subprocess.check_output(command, shell=True, timeout=5)
except Exception:
print ("Some issues in fetching details")
exit()
else:
print (x)
- Sind Sie mit Python 2 oder 3?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python 2.7 unterstützt keine timeout-parameter. Sie können stattdessen EasyProcess. Dies ist eine Ebene auf der Oberseite der Teilprozess-Modul und ziemlich einfach zu bedienen.
Meine Vermutung ist, dass du deinen code in Python 2.
Wenn das der Fall ist,
subprocess.check_output()
nicht akzeptierentimeout
parameter, und die Funktion wird sofort fehl mit:Aber, weil Sie fangen alle Ausnahmen und drucken Sie eine generische Nachricht, die Sie nicht sehen, die tatsächliche Ausnahme, und Sie davon ausgehen, dass der Befehl Timeout sofort.
Einen Weg, um dieses problem zu beheben ist zum ausführen von code in Python 3.
Unabhängig davon, ob Sie Python 2 oder 3, empfehle ich, dass Sie nicht alle Ausnahmen abfangen, oder dass Sie zumindest drucken Sie den Wert der Ausnahme, so dass Sie sehen können, die eigentliche Ursache, z.B.
explizit überprüft, ob es eine timeout-exception. Alle anderen Ausnahmen sind nachwievor wie gewohnt und so sind nicht maskiert, indem Sie Ihre "catch all" - code. Oder,
aber ersteres ist bevorzugt.
Bearbeiten
OP nicht verwenden Python 3. Wenn Sie mit Linux arbeiten, dann könnten Sie die
timeout
Befehl, z.B.Auf timeout dieser löst eine Ausnahme mit einem bestimmten exit-status Wert von 124:
BTW, sollten Sie nicht verwenden die
shell=True
option, da es Auswirkungen auf die Sicherheit wie in der Dokumentation erwähnt. Stattdessen sollten Sie übergeben eine Liste von strings zucheck_output()
wie diese:Wenn Sie mit einem anderen OS (oder Sie nicht verwenden möchten
timeout
) dann können Sie Ihre Teilprozess in einem separaten thread und haben Ihre Haupt-thread mal es aus, wenn erforderlich. Die andere Frage, Mit Modul 'subprocess' mit timeout, für details darüber, wie das zu tun.timeout
der code ist sofort gehen die außer Teil. Es scheint, es hat nichts damit zu tun, wie der generische Ausnahme, die ich gewählt habe. Können Sie mir bitte helfen mit einer anderen Lösung?check_output()
. Die Tatsache, dass Sie nicht wissen, ist, weil Sie Ihre exception-handler nicht drucken die eigentliche Ausnahme, und so waren Sie ratlos, warum dein code nicht. OK Sie können nicht verwenden Python 3. Welches OS verwenden Sie?x = subprocess.check_output(['timeout', '5', 'sleep', '10'])
. Was passiert, wenn Sie Sie ausführen (nur geben Sie es in ein Python-2-interpreter)?x = subprocess.check_output(['timeout', '5', 'sleep', '10'])
und der direkt gehen, die außer Teil. Ich gab auch diesesx = subprocess.check_output(command, ['timeout', '5', 'sleep', '10'])
von denen ich nicht sicher bin, aber in diesem Fall auch, es ging direkt zu der außer Teil.subprocess.check_output(['timeout', '5', 'sleep', '10'])
direkt in den Python-2-interpreter und sehen, was passiert. Es sollte nach 5 Sekunden, und eine Ausnahme wird ausgelöst. Wenn das funktioniert, dann konstruieren Sie den Befehl mit string-Formatierung (siehe Antwort), und versuchen Sie, die.subprocess.check_output(['timeout', '5', 'sleep', '10'])
Arbeit? Hoffentlich werden Sie nicht sehen, einen syntax-Fehler für das.import subprocess try: subprocess.check_output(['timeout', '5', 'sleep', '10']) except Exception as e: print "exception"
Dies ist, was ich versucht habe und beim laufen bekomme ich diesen Fehler:./test.py: line 5: syntax error near unexpected token `['timeout',' ./test.py: line 5: ` subprocess.check_output(['timeout', '5', 'sleep', '10'])'
'
"), aber ich weiß nicht, ob Sie in die traceback-oder wenn Sie Sie dort für die Formatierung. Ansonsten ist der code sieht OK aus.