Heim >Backend-Entwicklung >Python-Tutorial >Warum bleibt Python „subprocess.readline()' hängen, wenn die Ruby-Ausgabe gestreamt wird, und wie kann ich das Problem beheben?

Warum bleibt Python „subprocess.readline()' hängen, wenn die Ruby-Ausgabe gestreamt wird, und wie kann ich das Problem beheben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-21 00:21:09270Durchsuche

Why Does Python `subprocess.readline()` Hang When Streaming Ruby Output, and How Can I Fix It?

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:

  • Pexpect: Diese Bibliothek könnte eine alternative Methode zur Verwaltung der Prozessinteraktion bieten.
  • stdbuf: Dieses Tool ermöglicht die Zeilenpufferung im nicht interaktiven Modus und ermöglicht so eine sofortige Aktivierung Ausgabe.
  • Geänderter PTY-Ansatz:

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn