Seite 1 von 1

subprocess.Popen(…).stderr.readline blockiert

Verfasst: Dienstag 17. Juli 2012, 20:05
von Dav1d
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?

Re: subprocess.Popen(…).stderr.readline blockiert

Verfasst: Dienstag 17. Juli 2012, 20:32
von DasIch
Das liegt wahrscheinlich am buffering, welches da intern passiert aber prinzipiell blockt `fd.read(1)` auch es sei den `fd` ist non-blocking.

Re: subprocess.Popen(…).stderr.readline blockiert

Verfasst: Mittwoch 18. Juli 2012, 09:33
von Dav1d
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?

Re: subprocess.Popen(…).stderr.readline blockiert

Verfasst: Mittwoch 18. Juli 2012, 09:53
von 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.

Re: subprocess.Popen(…).stderr.readline blockiert

Verfasst: Mittwoch 18. Juli 2012, 10:42
von Dav1d
@deets, Newlines kommen dauernd alle ~50 Zeichen, insgesamt sind es bis zu 100 Newlines.