Erfassen Ende tty Ausgang
-
21-09-2019 - |
Frage
Hallo Ich schreibe eine psudo-Terminal, das in einem tty und laichen ein zweites tty leben können, die Filter-Eingang und Ausgang von
Ich bin es in Python zu schreiben jetzt, Laichen die zweite tty und Lesen und Schreiben ist einfach
aber wenn ich lese, wird die Lese nicht zu Ende, es für mehr Eingabe wartet.
import subprocess
pfd = subprocess.Popen(['/bin/sh'], shell=True,
stdout=subprocess.PIPE, stdin=subprocess.PIPE)
cmd = "ls"
pfd.stdin.write(cmd + '\n')
out = ''
while 1:
c = pfd.stdout.read(1)
if not c: # if end of output (this never happends)
break
if c == '\n': # print line when found
print repr(out)
out = ''
else:
out += c
----------------------------- Ausgänge ----------------- -------
intty $ python intty.py
'intty.py'
'testA_blank'
'testB_blank'
(hangs here does not return)
sieht es aus wie es ist das Ende der hte Puffer erreicht und statt der Rückkehr Keine oder ‚‘ Es hängt für mehr Input zu warten.
Was soll ich suchen, um zu sehen, ob die Ausgabe abgeschlossen ist? das Ende des Puffers? ein nicht-druckbare Zeichen?
---------------- bearbeiten -------------
Das happends auch wenn ich xpcshell statt ls laufen, ich bin diese interaktive Programme unter der Annahme haben in gewisser Weise die Aufforderung zu wissen, wieder angezeigt werden, eigenartige die Aufforderung, in diesem Fall "js>" nie apears
Lösung
Nun, Ihr Ausgang ist eigentlich nicht abgeschlossen. Weil Sie /bin/sh
gelaicht wird die Schale noch läuft nach „ls“ abgeschlossen ist. Es gibt keinen EOF-Indikatoren, weil es immer noch läuft.
Warum nicht einfach laufen /bin/ls
?
Sie könnten wie etwas tun
pfd = subprocess.Popen(['ls'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
out, err_output = pfd.communicate()
Dies ist auch Highlights subprocess.communicate
, die eine sicherere Art und Weise ausgegeben zu bekommen (für Ausgänge, die in den Speicher passen, jedenfalls) aus einem einzigen Programm. Dies wird nur zurück, wenn das Programm beendet Lauf hat.
Alternativ -could- Sie linewise aus der Schale lesen, aber Sie würden für eine spezielle Shell-Sequenz wie die sh~#
Linie suchen, die leicht nach oben in der Programmausgabe zeigen konnten. So eine Shell läuft, ist wahrscheinlich eine schlechte Idee überall.
Bearbeiten Hier ist, was ich meinte, aber es ist noch nicht wirklich die beste Lösung, da es eine Menge von Einschränkungen hat:
while 1:
c = pfd.stdout.read(1)
if not c:
break
elif c == '\n': # print line when found
print repr(out)
out = ''
else:
out += c
if out.strip() == 'sh#':
break
Beachten Sie, dass diese ausbrechen wird, wenn eine andere Befehlsausgänge ‚sh #‘ am Anfang der Linie, und auch aus irgendeinem Grund, wenn die Ausgabe von der erwarteten abweicht, wird geben Sie die gleiche Sperr Situation wie zuvor. Aus diesem Grunde ist es eine sehr suboptimale Situation für eine Shell.
Andere Tipps
Für Anwendungen, wie eine Muschel, wird der Ausgang nicht, bis die Schale Enden enden. Entweder verwenden Sie select.select()
zu überprüfen, ob es mehr Leistung wartet auf Sie hat, oder den Prozess beenden.