@_Mala_Fide_: Was die Namen angeht ist es unschön bis falsch in der gleichen Funktion `pipe_read` mal für einen Dateideskriptor, also eine Zahl, und mal für ein komplettes Dateiobjekt zu verwenden.
Der Kindprozess schliesst das schreibende Ende der Pipe nicht explizit.
Du kodierst im Kindprozess die Daten als UTF-8 aber beim `os.fdopen()` wird keine Kodierung angegeben. Das kann funktionieren, muss es aber nicht. Wenn man Textdateien öffnet sollte man immer die Kodierung angeben.
Die `bytes()`-Funktion zum Kodieren zu verwenden ist eher ungewöhnlich. Die `encode()`-Methode auf der Zeichenkette wird da normalerweise für genommen. Man muss diese Kodierung der immer gleichen Daten auch nicht bei jedem Schleifendurchlauf machen.
Wo es möglich ist, sollte man Dateien mit ``with`` verwenden, damit die auch geschlossen werden wenn beispielsweise eine Ausnahme auftritt.
Statt `range()` oder manuell mit ``+= 1`` einen Zähler zu führen könnte man auch einfach über die Datei iterieren und den Zähler mit `enumerate()` generieren.
Code: Alles auswählen
#!/usr/bin/env python3
import os
def child(output_fd):
names = "Baum, Haus, Kuchen\n".encode("utf-8")
for _ in range(2):
os.write(output_fd, names)
def parent():
input_fd, output_fd = os.pipe()
if os.fork() == 0:
try:
os.close(input_fd)
child(output_fd)
finally:
os.close(output_fd)
else:
os.close(output_fd)
with os.fdopen(input_fd, encoding="utf-8") as read_file:
for i, line in enumerate(read_file, 1):
print(f"{i}: {line}", end="")
print()
if __name__ == "__main__":
parent()