Hallo Liste, folgendes Problem: unter Linux soll ein externes Programm (wget) aus einem Python-Skript gestartet werden. Nun passiert es zum Beispiel bei ungueltigen Adressen, dass der wget-Prozess keine Daten liefert, obwohl ihm ein Timeout mit auf den Weg gegeben wurde (5 Sekunden), wahrscheinlich ein Problem von wget. Das Skript wartet nun solange bis wget aufgibt nach ca 4 Minuten. Wie kann man den wget Prozess so starten das Python diesen Prozess ca nach 4 Sekunden "abwürgen" kann? Ich wuerde die bisher aufgelaufenen Daten mit einem "connection timeout" vervollständigen. Ich habe es bisher mit os.system(Befehl zum wget Start) versucht, ok das ist die synchrone Variante, mit os.fork oder einer anderen asynchronen Variante bin ich bisher nicht vertraut. Gruss Mike _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Mike Abel wrote:
Hallo Liste,
folgendes Problem: unter Linux soll ein externes Programm (wget) aus einem Python-Skript gestartet werden. Nun passiert es zum Beispiel bei ungueltigen Adressen, dass der wget-Prozess keine Daten liefert, obwohl ihm ein Timeout mit auf den Weg gegeben wurde (5 Sekunden), wahrscheinlich ein Problem von wget. Das Skript wartet nun solange bis wget aufgibt nach ca 4 Minuten.
Wie kann man den wget Prozess so starten das Python diesen Prozess ca nach 4 Sekunden "abwürgen" kann? [...]
Klasse Popen3/Popen4 im Modul popen2. Du kriegst in dem erzeugten Objekt auch die PID mit, mit derer und os.kill du den Prozess im Zweifelsfall beenden kannst. -- Gerhard _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Klasse Popen3/Popen4 im Modul popen2.
Du kriegst in dem erzeugten Objekt auch die PID mit, mit derer und os.kill du den Prozess im Zweifelsfall beenden kannst.
Und dann rufst du in 'ner Schleife immer poll und sleep auf? Sehr coole Lösung, kannst du auch 'ne Alternative für Windows anbieten? Braucht der OP zwar nicht, fände ich aber sehr cool! ;-) Gruß, Achim _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Achim Domma (ProCoders) wrote:
Klasse Popen3/Popen4 im Modul popen2.
Du kriegst in dem erzeugten Objekt auch die PID mit, mit derer und os.kill du den Prozess im Zweifelsfall beenden kannst.
Und dann rufst du in 'ner Schleife immer poll und sleep auf? Sehr coole Lösung, kannst du auch 'ne Alternative für Windows anbieten? Braucht der OP zwar nicht, fände ich aber sehr cool! ;-)
Unter Windows gibt's statt poll() zwar auch select(), dafür aber kein Popen3/Popen4. Ich würd das ganze ja mit urllib und timeoutsocket machen. timeoutsocket ist zwar ein externes Modul (in 2.3 ist es integriert), aber wenn man's braucht, dann braucht man's wirklich. -- Gerhard _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Popen3/Popen4. Ich würd das ganze ja mit urllib und timeoutsocket machen. timeoutsocket ist zwar ein externes Modul (in 2.3 ist es integriert), aber wenn man's braucht, dann braucht man's wirklich.
Stimmt, timeoutsocket hat mich auch schonmal gerettet. Gut zu wissen, daß es in 2.3 integriert wird. Twisted hat übrigens eine Implementierung eines Crawlers dabei, soweit ich weiß. Ausprobiert habe ich das aber noch nicht. Hab' noch so meine Problem mit dem Verständnis von Twisted! ;-) Gruß, Achim _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Achim, mir haben die (schriftlichen) Ausführungen von Brian Warner auf der letzen Python Konferenz gut gefallen (leider war ich nicht da). http://www.python.org/cgi-bin/moinmoin/PyConBrianWarner und http://www.lothar.com/tech/papers/PyCon-2003/pb-pycon/pb.html Viel Spass (das macht Twisted dann) Martin -----Ursprüngliche Nachricht----- Von: python-de-admin@python.net [mailto:python-de-admin@python.net] Im Auftrag von Achim Domma (ProCoders) Gesendet: Donnerstag, 1. Mai 2003 15:25 An: python-de@python.net Betreff: RE: [Python-de] externe Programme
Popen3/Popen4. Ich würd das ganze ja mit urllib und timeoutsocket machen. timeoutsocket ist zwar ein externes Modul (in 2.3 ist es integriert), aber wenn man's braucht, dann braucht man's wirklich.
Stimmt, timeoutsocket hat mich auch schonmal gerettet. Gut zu wissen, daß es in 2.3 integriert wird. Twisted hat übrigens eine Implementierung eines Crawlers dabei, soweit ich weiß. Ausprobiert habe ich das aber noch nicht. Hab' noch so meine Problem mit dem Verständnis von Twisted! ;-) Gruß, Achim _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Unter Windows gibt's statt poll() zwar auch select(), dafür aber kein Popen3/Popen4. Ich würd das ganze ja mit urllib und timeoutsocket machen. timeoutsocket ist zwar ein externes Modul (in 2.3 ist es integriert), aber wenn man's braucht, dann braucht man's wirklich.
in der standard distribution ist doch auch so ein sauger dabei, liegt unter Tools, heisst websucker.py, falls der noch nicht mit timeoutsocket arbeitet, müsste es doch einfach sein das programm mal zu patchen... gruss, uwe
-- Gerhard
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Achim Domma (ProCoders) wrote:
Und dann rufst du in 'ner Schleife immer poll und sleep auf?
Nur poll (bzw. select). Da gibt man dann ein timeout mit an; wenn select mit timeout zurückkommt, muss der Prozess beendet werden, ansonsten kann man von den Files lesen.
Sehr coole Lösung, kannst du auch 'ne Alternative für Windows anbieten?
Ich würde win32process.CreateProcess versuchen, und dort in der startupinfo das Ergebnis von win32pipe.CreatePipe angeben. Man kann dann mit win32events.WaitForMultipleEvents auf Pipe-Aktivität, Prozessende oder Timeout warten und mit win32process.TerminateProcess den Prozess zwangsweise terminieren. Ciao, Martin _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
On Thu, 01 May 2003 15:26:49 +0200, Martin v. Löwis wrote:
Sehr coole Lösung, kannst du auch 'ne Alternative für Windows anbieten?
Ich würde win32process.CreateProcess versuchen, und dort in der startupinfo das Ergebnis von win32pipe.CreatePipe angeben. Man kann dann mit win32events.WaitForMultipleEvents auf Pipe- Aktivität, Prozessende oder Timeout warten und mit win32process.TerminateProcess den Prozess zwangsweise terminieren.
Ich würde den Code von einem Python-Linkbot nehmen, und auf so böse Sachen wie Spawnen von wget ganz verzichten. Ciao, Jürgen _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
On Thu, 01 May 2003 14:50:51 +0200 Gerhard Häring <gh@ghaering.de> wrote:
Klasse Popen3/Popen4 im Modul popen2.
Du kriegst in dem erzeugten Objekt auch die PID mit, mit derer und os.kill du den Prozess im Zweifelsfall beenden kannst.
Werde ich mir ansehen, Danke. Gruß Mike _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
On Thu, 01 May 2003 14:50:51 +0200 Gerhard Häring <gh@ghaering.de> wrote:
Klasse Popen3/Popen4 im Modul popen2.
Du kriegst in dem erzeugten Objekt auch die PID mit, mit derer und os.kill du den Prozess im Zweifelsfall beenden kannst.
Die obige Loesung hat nur einen Makel sie hinterlaesst zuviele Zombie Prozesse, die erst mit dem Ende des Python-Skripts aufgeraeumt werden. Ich bin beim weiteren Suchen auf folgendes Modul gestossen, welches diese Probleme nicht hat. - task.py (available from http://starship.python.net/crew/hooft/ ) Task is a way to run an independent sub-process, being able to wait for it and/or to kill it on the fly (it can redirect stdin/out as well). Gruss Mike _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Mike Abel wrote:
Die obige Loesung hat nur einen Makel sie hinterlaesst zuviele Zombie Prozesse, die erst mit dem Ende des Python-Skripts aufgeraeumt werden.
Du musst natürlich os.wait aufrufen, nachdem Du einen Prozess gekillt hast. Ciao, Martin _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
On Fri, 02 May 2003 10:59:18 +0200 "Martin v. Löwis" <martin@v.loewis.de> wrote:
Du musst natürlich os.wait aufrufen, nachdem Du einen Prozess gekillt hast.
Korrekt, mein Fehler, aehnliches wird im Modul task gemacht. Gruss Mike _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hi Mike,
Wie kann man den wget Prozess so starten das Python diesen Prozess ca nach 4 Sekunden "abwürgen" kann?
'abwürgen' von außen ist fast immer ein Problem und unsauber, vor allem wenn du OS unabhängig bleiben willst. Wenn irgendwie möglich, würde ich also zuerst versuchen, ob du das Problem nicht irgendwie auf der Ebene von wget lösen kannst. Sollte das aber unmöglich sein, ...
Ich habe es bisher mit os.system(Befehl zum wget Start) versucht, ok das ist die synchrone Variante, mit os.fork oder einer anderen asynchronen Variante bin ich bisher nicht vertraut.
... mußt du dir wohl die Funktionen zum Thema 'Prozess Management' im Modul os anschauen. Mit spawnxxx kannst du Prozesse starten und kommst ihre PID. Mit der kannst du dann auf ihre Beendigung warten, oder sie irgendwann abschießen. Allerdings kannst du beim Warten soweit ich weiß, kein Timeout angeben. D.h. du müßtest mit Threads arbeiten, wobei ein Thread das externe Programm startet und dein Hauptprogramm diesen Thread überwacht. Aber auch das zieht Probleme nach sich. Deshalb auch der Hinweis das Problem besser über wget zu lösen. Sollte jemand wirklich eine elegante Lösung für dein Problem finden, ohne das Verhälten von wget zu ändern, dann wäre ich auch sehr gespannt darauf! ;-) Gruß, Achim _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
On Thu, 1 May 2003 14:51:42 +0200 "Achim Domma \(ProCoders\)" <domma@procoders.net> wrote:
Wie kann man den wget Prozess so starten das Python diesen Prozess ca nach 4 Sekunden "abwürgen" kann?
'abwürgen' von außen ist fast immer ein Problem und unsauber, vor allem wenn du OS unabhängig bleiben willst. Wenn irgendwie möglich, würde ich also zuerst versuchen, ob du das Problem nicht irgendwie auf der Ebene von wget lösen kannst. Sollte das aber unmöglich sein, ...
Genau das scheint das Problem zu sein, das wget den auf der Kommandozeile mitgegebenen Timeout nicht beachtet, aus welchen Gruenden auch immer.
D.h. du müßtest mit Threads arbeiten, wobei ein Thread das externe Programm startet und dein Hauptprogramm diesen Thread überwacht. Aber auch das zieht Probleme nach sich.
genau das waere ziemlicher overkill. Danke trotzdem fuer die Problemdiskussion. Gruss Mike _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hi Mike, versuch mal den Aufruf von wget folgendermassen wget --tries=1 --timeout=10 [url] So müsste wget nach 10 Sekunden, wenn keine Verbindung zustande kommt abbrechen. Gruß Fritz _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (8)
-
"Martin v. Löwis"
-
Achim Domma (ProCoders)
-
Fritz Cizmarov
-
Gerhard Häring
-
Juergen Hermann
-
Martin.Moellenbeck@t-online.de
-
Mike Abel
-
Uwe Schmitt