Python-Unterprozess Readlines() verursacht Blockierungen im Stream
Das Ziel des Codes besteht darin, eine Ruby-Datei zu streamen und deren Inhalt nach und nach auszugeben. Während der Streaming-Aspekt erreicht ist, tritt ein Problem auf, bei dem readline() auf unbestimmte Zeit hängt und eine weitere Ausführung verhindert.
Untersuchung potenzieller Lösungen
Die Verwendung von pty ist plattformabhängig Ansatz, der die Unterstützung von Linux oder kompatiblen Betriebssystemen voraussetzt. Berücksichtigen Sie jedoch Bedenken hinsichtlich der plattformübergreifenden Kompatibilität:
Eine vorgeschlagene Verbesserung der bestehenden PTY-Implementierung:
import errno import os import pty from subprocess import Popen, STDOUT master_fd, slave_fd = pty.openpty() # provide tty to enable line-buffering on ruby's side proc = Popen(['ruby', 'ruby_sleep.rb'], stdin=slave_fd, stdout=slave_fd, stderr=STDOUT, close_fds=True) os.close(slave_fd) try: while 1: try: data = os.read(master_fd, 512) except OSError as e: if e.errno != errno.EIO: raise break # EIO means EOF on some systems else: if not data: # EOF break print('got ' + repr(data)) finally: os.close(master_fd) if proc.poll() is None: proc.kill() proc.wait() print("This is reached!")
Schlussfolgerung
Alle drei vorgeschlagenen Lösungen gehen das Problem an, indem sie die Zeilenpufferung für die sofortige Ausgabe ermöglichen, während die überarbeitete Der pty-Ansatz gewährleistet eine elegante Handhabung der Eingabe und Ausgabe und maximiert gleichzeitig die Plattformkompatibilität.
Das obige ist der detaillierte Inhalt vonWarum bleibt Python „subprocess.readline()' hängen, wenn die Ruby-Ausgabe gestreamt wird, und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!