Ich möchte auf die Traceback eines Python-Programms in einem Subprozess zugreifen.Subprozess Kind Traceback
The documentation sagt:
Exceptions raised in the child process, before the new program has started to execute, will be re-raised in the parent. Additionally, the exception object will have one extra attribute called child_traceback, which is a string containing traceback information from the child’s point of view.
Inhalt von my_sub_program.py
:
raise Exception("I am raised!")
Inhalt von my_main_program.py
:
import sys
import subprocess
try:
subprocess.check_output([sys.executable, "my_sub_program.py"])
except Exception as e:
print e.child_traceback
Wenn ich my_main_program.py
laufen, ich folgende Fehlermeldung erhalten:
Traceback (most recent call last):
File "my_main_program.py", line 6, in <module>
print e.child_traceback
AttributeError: 'CalledProcessError' object has no attribute 'child_traceback'
Wie kann ich auf die Traceback des Subprozesses zugreifen, ohne den Subprozess-Programmcode zu ändern? Das bedeutet, ich möchte vermeiden, dass eine große try/except
Klausel um meinen gesamten Unterprogrammcode hinzugefügt wird, sondern vielmehr die Fehlerprotokollierung von meinem Hauptprogramm aus.
Edit:sys.executable
sollte durch einen Interpreter ersetzt werden, der sich von dem unterscheidet, der das Hauptprogramm ausführt.
Doc sagt "bevor das neue Programm gestartet wurde", in Ihrem Fall wurde die Ausnahme ausgelöst, während das neue Programm ausgeführt wurde, daher kein 'child_traceback'. Sobald das neue Programm ausgeführt wird, müssen Sie die "CalledProcessError" -Ausnahme abfangen und wie folgt vorgehen: http://StackOverflow.com/questions/24849998/how-to-catch-exception-output-from-python-subprocess-check -output using 'CalledProcessError.output' – mguijarr
In meinem Beispiel hat 'CalledProcessError.output' nur die Standardausgabe erfasst, aber nicht die Rückverfolgung der Ausnahme. – schreon
Dies liegt wahrscheinlich daran, dass die Ausgabe an 'stderr' gesendet wird. Sehen Sie sich die Antworten aus der Frage an, für die ich Ihnen den obigen Link gesendet habe, um weitere Informationen zu erhalten. – mguijarr