[Python-de] Pipes

"Martin v. Löwis" martin at v.loewis.de
Die Apr 12 01:06:53 CEST 2005


Marcus Habermehl wrote:
> Wenn ich die Hilfe richtig verstanden habe, müsste das mit buffsize
> gehen. Allerdings hab ich auch gelesen, dass dies nicht mit jedem
> Programm und unter jedem OS funktioniert. Leider hab ich die Gründe
> nicht wirklich verstanden. Dafür hat mein Englisch dann doch nicht mehr
> gereicht.

Ich habe diesen Thread nicht von Anfang an mitverfolgt. Wenn aber
das Problem ist, dass von auf einer eingehenden Pipe gepuffert wird,
und man das nicht möchte, hat man ein echtes Problem:

Die Pufferung erfolgt nämlich auf der *sendenden* Seite, also dem
Programm, welches Du aufrufst (find ...). Dieses Programm weigert sich,
Dir Daten zu senden, bis sein eigener Puffer voll ist. Daran kann man
auch nichst durch Einstellung von Puffergrößen auf der empfangenden
Seite verändern.

Warum macht das Programm das? Es überprüft mit isatty(3), ob sein
eigenes stdout ein Terminal ist. Falls ja, möchte der Nutzer die
Ausgaben sofort, und das Programm verzichtet auf Pufferung (oder
beschränkt sich auf zeilenweise Pufferung). Falls nein, glaubt
das Programm, dass da kein Nutzer ist, und puffert mit normalem
stdio.

Idealerweise hätte nun das Programm einen Argument, mit dem man
ungepufferte Ausgabe festlegen kann. Wenn es das nicht hat, kann
man ihm ein Pseudo-Terminal vorgaukeln, so dass es mit isatty
glaubt, auf ein Terminal auszugeben. In Python gibt es dafür
das Modul pty; das funktioniert aber nur auf ausgewählten Systemen.

Ciao,
Martin