Ich habe ein Skript, das farbige Ausgabe druckt, wenn es auf tty ist. Ein Haufen von ihnen wird parallel ausgeführt, so dass ich ihre Stdout nicht zu tty setzen kann. Ich habe auch keine Kontrolle über den Skript-Code (um die Farbe zu erzwingen), also möchte ich es über pty vortäuschen. Mein Code:Lesen von pty ohne endlos hängen
invocation = get_invocation()
master, slave = pty.openpty()
subprocess.call(invocation, stdout=slave)
print string_from_fd(master)
Und ich kann nicht herausfinden, was in string_from_fd
sein sollte. Denn jetzt habe ich so etwas wie
def string_from_fd(fd):
return os.read(fd, 1000)
Es funktioniert, aber diese Zahl 1000
sieht seltsam aus. Ich denke, die Ausgabe kann leise groß sein, und jede Zahl dort könnte nicht ausreichen. Ich habe viele Lösungen aus dem Stapelüberlauf versucht, aber keiner von ihnen funktioniert (es druckt nichts oder hängt für immer).
Ich bin nicht sehr vertraut mit Dateideskriptoren und all das, so dass jede Klärung, wenn ich etwas falsch mache würde sehr geschätzt werden.
Danke!
hmm, habe ich versucht, und es funktioniert nicht. Es geht einfach "wahr": "für immer. –
Ich habe den 'Popen'-Aufruf so aktualisiert, dass der erzeugte Prozess * nur * den PTY sieht.Wenn dies die Dinge nicht ändert, dann: Welches Betriebssystem benutzen Sie? Sind Sie sicher, dass das Skript, das Sie ausführen möchten, beendet wird/nicht blockiert, weil es Benutzereingaben erwartet? Ist mein Beispiel as-is beendet oder läuft es auch für immer? Können Sie einen Beispielbefehl erstellen, den Sie teilen möchten, wenn die Schleife nicht beendet wird? Mit welcher Python-Version? (Versuchen Sie zu Debugging-Zwecken, einen 'print repr (output [-1])' innerhalb der while-Schleife hinzuzufügen.) – Phillip
Ich verwende OS X 10.12, Python 2.7.10. Selbst mit Ihrem Beispiel, '/ bin/ls --color', bleibt es hängen. 'print repr (Ausgabe [-1])' schreibt endlos '' '' - nur leere Zeichenfolge. –