subprocess.Popen(…).stderr.readline blockiert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Das funktioniert:

Code: Alles auswählen

    def _yield_lines(self, fd):
        line = list()
        while True:
            char = fd.read(1)
            #line = fd.readline()
            if not char:
                break
            else:
                line.append(char)
            
            if char == '\n':
                yield ''.join(line)
                line = list()

p = Popen(args, stdout=PIPE, stderr=PIPE, universal_newlines=True)
_yield_lines(p.stderr)
Falls ich nun aber `#line = fd.readline()` anstatt `fd.read(1)` blockt `fd.readline()` die Ausgabe bis zum Ende, wo ist der Unterschied?
the more they change the more they stay the same
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das liegt wahrscheinlich am buffering, welches da intern passiert aber prinzipiell blockt `fd.read(1)` auch es sei den `fd` ist non-blocking.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

DasIch hat geschrieben:Das liegt wahrscheinlich am buffering, welches da intern passiert aber prinzipiell blockt `fd.read(1)` auch es sei den `fd` ist non-blocking.
Stimmt: `fd.read(1)` gibt mir Daten zurück sobald sie vorhanden sind, `fd.readline()` gibt mir erst Daten zurück wenn der Prozess beendet ist. Welches internes buffering? Laut Dokumentation findet bei `bufsize=0` (= default), kein buffering statt? Oder meinst du eine Ebene unter subprocess?
the more they change the more they stay the same
deets

readline wartet mindestens mal auf ein newline. und buffering findet eigentlich immer statt bei pipes, du kannst das gar nicht kontrollieren - das koennte wenn nur das aufgerufene programm durch flush-calls.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@deets, Newlines kommen dauernd alle ~50 Zeichen, insgesamt sind es bis zu 100 Newlines.
the more they change the more they stay the same
Antworten