Hallo,
ich habe folgendes Problem und weiß einfach nicht mehr weiter.
Ich versuche einen Prozess zu starten, was so weit auch ganz gut funktioniert.
Doch ca alle 100-200 mal gibt es folgende Probleme:
Der python Interpreter wird gekillt, oder beendet, oder sonstwas, aufjeden Fall ist der Prozess weg, vollkommen ohne Rückmeldung!
Oder er ist noch da, aber es passiert überhaupt nichts mehr.
Ich habe es schon mit subprocess.popen os.popen, popen2.popen2 versucht, bei allen tritt dieses Problem m.E. vollkommen willkürlich auf.
Ich hoffe jemand von euch kann mit helfen das Problem oder eine Alternative zu finden.
Viele Grüße
RaNaN
Probleme mit subprocess/popen
@RaNaN: Ohne mehr Details und vielleicht minimalen lauffähigen Quelltext, der das Problem aufweist, kann man da nicht viel sagen.
Wie startest Du das Programm? Würdest Du eventuelle Abbrüche durch Ausnahmen zu sehen bekommen? Kann es sein, dass Du irgendwo offene Datei-Handles ansammelst und das Betriebssystem dann irgdendwann keine mehr für den Prozess hat?
Wie startest Du das Programm? Würdest Du eventuelle Abbrüche durch Ausnahmen zu sehen bekommen? Kann es sein, dass Du irgendwo offene Datei-Handles ansammelst und das Betriebssystem dann irgdendwann keine mehr für den Prozess hat?
Ok, hiermal 2 Beispiele mit denen ich es versucht habe.
Das Programm starte ich ganz normal python programm.py
Leider bekomme ich bei diesem Problem nie irgendwleche Ausnahmen angezeigt.
Das mit den Datei-Handler könnte unter Umständen ein möglicher Grund sein, kann ich das irgendwie überprüfen?
EDIT: Habe es eben überprüft mit
und sieht ganz normal aus.
Code: Alles auswählen
pipe = subprocess.PIPE
popen = subprocess.Popen(self.command, stdout=pipe, stderr=pipe)
outputdata, errdata = popen.communicate(self.inputdata)
assert (popen.returncode == 0), \
"Error running: %s\n\n%s" % (self.command, errdata)
result = outputdata
Code: Alles auswählen
pipe = os.popen(command)
result = pipe.read()
pipe.close()
Leider bekomme ich bei diesem Problem nie irgendwleche Ausnahmen angezeigt.
Das mit den Datei-Handler könnte unter Umständen ein möglicher Grund sein, kann ich das irgendwie überprüfen?
EDIT: Habe es eben überprüft mit
Code: Alles auswählen
ls -l /proc/$pid/fd/
Zeile 1: Brauchst du das wirklich so? Ansonsten ``from subprocess import PIPE as pipe``.RaNaN hat geschrieben:Ok, hiermal 2 Beispiele mit denen ich es versucht habe.
Code: Alles auswählen
pipe = subprocess.PIPE popen = subprocess.Popen(self.command, stdout=pipe, stderr=pipe) outputdata, errdata = popen.communicate(self.inputdata) assert (popen.returncode == 0), \ "Error running: %s\n\n%s" % (self.command, errdata) result = outputdata
Zeile 2: Ist wahrscheinlich Geschmackssache, aber ich hätte hier den Programmnamen statt ``popen`` gewählt. Was verbirgt sich hinter ``command``? Wird eine Liste übergeben?
Zeile 3: Was ist dein ``inputdata``?
Zeile 4: ``assert()`` ist hier wirklich nicht angebracht. IMHO sollte man hier ein ``if not returncode == 0`` bzw ``if returncode != 0`` einsetzen.
Letzte Zeile: Es ist total unnötig, Referenzen hin und her zu schieben. Dann nimm doch ``result`` schon oben.
Danke für deine Hinweise, aber die helfen nicht bei dem Problem weiter, dass der Interpreter unregelmäßig beim Aufrufen von Prozessen abstürzt.
command ist eine Liste. und der Befehl ist ein Aufruf von "tesseract", aber sogar bei "cat" oder einem Aufruf von einem Script ist es schon passiert.
Inputdata ist im Moment immer None.
command ist eine Liste. und der Befehl ist ein Aufruf von "tesseract", aber sogar bei "cat" oder einem Aufruf von einem Script ist es schon passiert.
Inputdata ist im Moment immer None.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Dann poste doch mal ein minimales Beispiel, das genaus so lauffähig ist und diesen Fehler verursacht. Am besten natürlich mit einem Standard-Tool wie cat, das hier viele auch nutzen können zum Testen.
Dann hast Du wohl den falschen Code isoliert und der Fehler ist nicht da, wo Du ihn vermutest. Das verschwinden des Prozesses hat dann vielleicht überhaupt nichts mit dem starten externer Programme zu tun. Dafür würde ja auch sprechen, dass Du verschiedene Möglichkeiten durchprobiert hast Programme zu starten.
Was machst Du denn sonst noch so? Von mehreren Threads aus auf ein GUI-Toolkit zugreifen?
Was machst Du denn sonst noch so? Von mehreren Threads aus auf ein GUI-Toolkit zugreifen?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das würde ich nicht machen. Schnell Fragt man sich, woher kommt "pipe". Ich versuche imports nicht tiefer als ein Modul zu machen (Was ich bei django oft auch nicht mache).snafu hat geschrieben:Zeile 1: Brauchst du das wirklich so? Ansonsten ``from subprocess import PIPE as pipe``.RaNaN hat geschrieben:Code: Alles auswählen
pipe = subprocess.PIPE popen = subprocess.Popen(self.command, stdout=pipe, stderr=pipe)
Was ist so schlimm daran subprocess.PIPE zu schreiben? Das "abkürzen" auf "pipe" würde ich mir sparen:
Code: Alles auswählen
popen = subprocess.Popen(self.command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ach, also wenn der Name ``pipe`` nur lokal ist, und die Funktion dafür zuständig ist Prozesse zu starten, finde ich das das (in Übereinstimmung mit Pike und Kernighan) eigentlich ganz ok. Modulglobal müsste das jetzt aber nicht sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
@BlackJack:
Ich habe versucht den Fehler mit Logs sehr genau einzugrenzen und bin mir sicher, dass er beim Aufruf vom Prozessen kommt.
Das Programm läuft ohne Gui, aber hat noch mehrere Threads offen, z.b ein Socket, weiß aber nicht ob das damit zusammen hängt. Mir fehler leider jegliche Anhaltspunkte um die Ursache ausfindig zumachen
Ich habe versucht den Fehler mit Logs sehr genau einzugrenzen und bin mir sicher, dass er beim Aufruf vom Prozessen kommt.
Das Programm läuft ohne Gui, aber hat noch mehrere Threads offen, z.b ein Socket, weiß aber nicht ob das damit zusammen hängt. Mir fehler leider jegliche Anhaltspunkte um die Ursache ausfindig zumachen