Seite 1 von 1

Aus py-Script gestartetes Programm stürzt ab

Verfasst: Freitag 6. April 2007, 10:11
von antaeus
Hallo zusammen!

Ich habe ein kleines Problem - mal wieder mit dem Starten und Beenden von Applikationen über Python. Ich will ein Programm, einen in Python geschriebenen Proxy-Server, testen. Dazu muss ich in der Lage sein können, das Programm aus einem anderen Python-Skript heraus zu starten und zu beenden. Starten und Beenden klappt -wie unten abgebildet- wunderbar, aber es treten irgendwelche Probleme auf, wenn ich den Proxy so starte. Der Proxy scheint plötzlich nicht mehr erreichbar zu sein... Woran es liegt, kann ich nicht sagen, da alle Debug-Ausgaben des Proxy nicht auf die Konsole geschrieben werden. Ich weiß nur, dass der Proxy, wenn er von Hand gestartet wurde, funktioniert.

Frage 1: Ist grundsätzlich irgendwas daran falsch, ein Programm so zu starten, wie ich das tue? Evtl. tritt bei dieser Art den Proxy zu starten einfach ein Problem auf, der Proxy stürzt ab ohne dass ich das merkt und das wars.

Frage 2: Wie kann ich erreichen, dass die Debug-Ausgaben des Proxy auch auf der Konsole des aufrufenden Skripts landen?

Code: Alles auswählen

    
    def start_proxy(self):
        
        python = "/usr/bin/python"
        proxy = "/home/tuebingen_test/proxy/main.py"
        command = python + " " + cosip_path
        
        print "Starting Proxy" 
        self.proxy = Popen4(command)
        return self.proxy.pid
    
    def stop_cosip_proxy(self):
        
        print "Stopping Proxy"
        kill(self.proxy.pid, 15)
        return 0

Verfasst: Freitag 6. April 2007, 10:21
von EnTeQuAk
[/quote]

Frage 1: Ist grundsätzlich irgendwas daran falsch, ein Programm so zu starten, wie ich das tue? Evtl. tritt bei dieser Art den Proxy zu starten einfach ein Problem auf, der Proxy stürzt ab ohne dass ich das merkt und das wars.
[/quote]

Schau dir mal bitte das neue Modul ``subprocess`` an.
[wiki]Neue Features#Subprocess[/wiki]

Da gibt es auch die Möglichkeit, Fehlermeldungen zurückzugeben. Dann siehst du, warum der Proxy abgeschmiert ist.

Verfasst: Freitag 6. April 2007, 10:57
von antaeus
Danke für deine Antwort. Ich werde mir das mal genauer ansehen. Vielleicht ist das was. Aber ich fürchte, dass das mein Problem nicht genau trifft.

Ich habe mich vorher vielleicht auch etwas unklar ausgedrückt. Der Proxy ist ein Programm, dass keine feste Laufzeit hat. D.h. ich kann den Proxy nicht einfach mal so aufrufen, auf dessen Beendung warten und dann einmal die Debug-Ausgabe auslesen... Der Proxy läuft quasi im Hintergrund und loggt alles was er so tut auf die Konsole.

Während dessen muss die Test-Anwendung, die den Proxy Startet, weiter laufen können!

Verfasst: Freitag 6. April 2007, 12:39
von BlackJack
Wo genau landen denn die Ausgaben des Proxy-Programms, bzw. was machst Du mit denen?

Verfasst: Freitag 6. April 2007, 16:31
von antaeus
Die Ausgaben des Proxy dienen nur Debug-Zwecken. Die schreiben halt auf die Konsole, wenn Pakete empfangen werden und wieder rausgehen... Ich habe allerdings keine Ahnung, was mit diesen Ausgaben geschieht, wenn ich den Proxy über das Skript (wie oben beschrieben) starte. Auf die Konsole des startenden Programms werden sie jedenfalls nicht geschrieben. Das unangenehme ich leider auch, dass wenn das Programm abschmiert, z.B. bei einem Programmierungsfehler, dass KEIN Python Trace auf der Konsole des aufrufenden Programms erscheint.

Verfasst: Freitag 6. April 2007, 18:26
von BlackJack
Dann haben wir hier wahrscheinlich das Problem. Die Standardausgabe vom Proxy wird mit Deinem Skript verbunden und Du liest sie nie aus. Der Proxy schreibt in die Pipe, irgendwann ist der Puffer voll und der nächste Schreibzugriff blockiert den Proxy.

Verfasst: Freitag 6. April 2007, 18:57
von antaeus
Ah, so etwas in der Richtung habe ich mir auch schon überlegt. D.h. ich muss die Pipe auslesen oder flushen und dann ist das Problem behoben?

Könntest du mir bitte sagen, wie ich das bewerkstellige? Ich muss dieses Problem ganz schnell lösen und hier brennt es an allen Ecken und Enden...

Verfasst: Freitag 6. April 2007, 19:47
von BlackJack
Ich würde `subprocess` benutzen. Da werden entweder die Dateihandles vom Pythonprogramm weiterbenutzt, d.h. die Ausgaben vom Proxy werden wieder "sichtbar", oder Du kannst `stderr` und `stdout` vom gestarteten Programm explizit nach "/dev/null" umleiten. Einen Namen für so ein "Null-Device" gibt's plattformunabhängig unter `os.devnull`.