[Python-de] tee in Python

Florian Lindner mailinglists at xgm.de
So Feb 5 16:48:57 CET 2012


Am 5. Februar 2012 14:03 schrieb Florian Lindner <mailinglists at xgm.de>:
> Ok, ich habe es jetzt so geändert:
>
>        proc = subprocess.Popen(shlex.split(cmd),
> stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>        while True:
>            out = proc.stdout.readline()
>            if out == '' and proc.poll() != None:
>                break
>            sys.stdout.write(out)
>            logfile.write(out)
>
> Scheint so zu funktionieren.

Mmh, leider doch nicht so wirklich.

Es scheint, als ob immer erst einige Zeilen gebuffered werden und dann
en bloc ausgegeben werden. Am Ende kommt also das gleiche raus, aber
mit einer blockweisen Verzögerung.

Gibt es eine Möglichkeit, wie ich das ändern kann?

Grüße,
Florian

> Am 5. Februar 2012 12:03 schrieb Christian Heimes <lists at cheimes.de>:
>> Am 05.02.2012 11:51, schrieb Florian Lindner:
>>> Das Attribut fileno habe hinzugefügt, da sich Popen beschwert hat, das
>>> es nicht vorhanden ist. Was ich da sinnvoll zurückgeben soll, weiß ich
>>> leider nicht. In der Doku steht jedoch: File-like objects which do not
>>> have a real file descriptor should not provide this method!
>>
>> Das hätte dir schon einen Hinweis geben können. ;)
>>
>>> Was stimmt da noch nicht?
>>
>> Popen benötigt zwingend eine Objekt mit einem echten file descriptor,
>> ein file like object ist hier nicht ausreichend. Popen ist nur ein
>> Wrapper um einige syscalls. Das Betriebsystem arbeitet intern nur mit
>> file descriptors bzw. file handles. Der Kernel kann
>> (verständlicherweise) nichts von der Python API verstehen und verwenden.
>>
>> Die FDs darfst du nicht als Zahlen betrachten. Es sind magic cookies,
>> die vom Kernel vergeben werden und für den jeweiligen Prozess eine
>> Resource wie geöffnete Datei, Socket usw. eindeutig referenzieren.
>>
>> Um sowas wie tee zu implementieren, müsstest du dem Kindprozess eine
>> Pipe übergeben. Genau das würdest du ja auch machen, wenn du "ls | tee
>> logfile" machst. 'ls' schreibt in die Pipe, 'tee' liest aus der Pipe und
>> verteilt dann die Datenströme auf mehrere Ausgabeströme.
>>
>> Christian
>>
>> _______________________________________________
>> python-de maillist  -  python-de at python.org
>> http://mail.python.org/mailman/listinfo/python-de


Mehr Informationen über die Mailingliste python-de