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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top