Seite 1 von 1

Prozessausgabe durchgehend weiterleiten

Verfasst: Samstag 17. Oktober 2009, 00:22
von snafu
Desöfteren liest man, dass die Ausgabe von Unterprozessen sozusagen "live" mitgeschnitten werden soll. Eine mögliche Lösung wäre die hier.

Code: Alles auswählen

>>> def handler(data): print '*** OUTPUT *** \n {0} \n'.format(data)
... 
>>> args = ['wget', 'http://www.python-forum.org/', '--delete-after']
>>> redirect_process_output(args, handler)
*** OUTPUT *** 
 --2009-10-17 01:20:48--  http://www.python-forum.org/
Auflösen des Hostnamen »www.python-forum.org«....  

*** OUTPUT *** 
 64.157.176.237
Verbindungsaufbau zu www.python-forum.org|64.157.176.237|:80...  

*** OUTPUT *** 
 verbunden.
HTTP Anforderung gesendet, warte auf Antwort...  

*** OUTPUT *** 
 200 OK
Länge: nicht spezifiziert [text/html]
In »index.html« speichern.

    [<=>                                    ] 0           --.-K/s               

*** OUTPUT *** 
    [ <=>                                   ] 5.160       --.-K/s   in 0,03s   

2009-10-17 01:20:48 (159 KB/s) - »index.html« gespeichert [5160]

Entferne »index.html«.

Verfasst: Samstag 17. Oktober 2009, 11:38
von lunar
Hat es einen besonderen Grund, warum Du nicht "select" verwendest? Das würde dann nämlich auf jedem Unix funktionieren.

Außerdem darfst Du meinem Verständnis der Dokumentation nach epoll nur im Vaterprozess aufrufen (also "pid != 0"). Der Kindprozess erhält gar kein gültigen Filedeskriptor durch den "pty.fork()"-Aufruf. "epoll.register" müsste im Kind daher direkt fehlschlagen. Das fällt wahrscheinlich nur nicht auf, weil Du die Ausnahme abfängst.

Zudem wäre es möglich, dass "epoll()"-Systemaufrufe durch Signalhandler unterbrochen werden können. In diesem Fall müsstest Du noch auf "errno.EINTR" prüfen, und in diesem Fall einfach fortfahren. Da müsstest Du mal Dokumentation lesen.

Zum Stil: Die magische Konstante finde ich unschön. Ein errno-Import bringt Dich schon nicht um ;)

Verfasst: Samstag 17. Oktober 2009, 11:47
von EyDu
Aus BUFSIZE würde ich auch gleich noch einen Parameter machen.