Probleme mit subprocess/popen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RaNaN
User
Beiträge: 5
Registriert: Samstag 5. September 2009, 14:01

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
BlackJack

@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?
RaNaN
User
Beiträge: 5
Registriert: Samstag 5. September 2009, 14:01

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

Code: Alles auswählen

pipe = os.popen(command)
result = pipe.read()
pipe.close()
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

Code: Alles auswählen

ls -l /proc/$pid/fd/
und sieht ganz normal aus.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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 1: Brauchst du das wirklich so? Ansonsten ``from subprocess import PIPE as pipe``.

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.
RaNaN
User
Beiträge: 5
Registriert: Samstag 5. September 2009, 14:01

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.
Benutzeravatar
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.
RaNaN
User
Beiträge: 5
Registriert: Samstag 5. September 2009, 14:01

Wenn ich den Code isoliere tritt der Fehler leider nicht mehr auf, ich werde wohl damit Leben müssen und schreibe ein Script, welches prüft ob das Programm noch läuft.
Vielen Dank für eure Bemühungen!
BlackJack

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

snafu hat geschrieben:
RaNaN hat geschrieben:

Code: Alles auswählen

pipe = subprocess.PIPE
popen = subprocess.Popen(self.command, stdout=pipe, stderr=pipe)
Zeile 1: Brauchst du das wirklich so? Ansonsten ``from subprocess import PIPE as pipe``.
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).

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
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
RaNaN
User
Beiträge: 5
Registriert: Samstag 5. September 2009, 14:01

@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 :(
Antworten