2016-04-18 13 views
3

Wenn ich in Bash ctrl-r drücken, kann ich (reverse-i-search) Prompt sehen.Senden von Strg-R zu Bash in einem Python-Subprozess

In Python kann ich einen Bash-Prozess offen wie diese

p = subprocess.Popen(['bash'], stdin=subprocess.PIPE, 
     stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Jetzt kann ich ctrl-r Informationen zu diesem Prozess senden und lesen Sie die (reverse-i-search) prompt in Python?

Ich mache zu lernen pty, und ich frage mich nur, ob es möglich ist, einen Terminalemulator zu codieren, ohne pty zu verwenden.

+1

Theoretisch sollten Sie in der Lage sein, 'showkey --scancodes' auszuführen und die exakt gleiche Ausgabe in Ihren Subprozess schreiben. Aus irgendeinem Grund kann ich keine Eingaben und Ausgaben an meiner virtuellen Maschine ausführen, aber es sollte so einfach sein wie 'p.stdin.write (b '^ R)', wenn ich mich nicht irre. – Torxed

+0

Sie brauchen das, weil Sie es in einer VM senden müssen? – EugenG

+0

@iugene Ich bin nur neugierig, ob das gemacht werden könnte. – zjk

Antwort

2

Das Senden der ctrl-r Zeichencode an den Bash-Prozess ist genug für einen Start.

Wenn bash jedoch feststellt, dass es nicht mit einem Terminal verbunden ist, verwendet es nicht interaktiven Modus. In diesem Modus ist die Zeilenbearbeitung deaktiviert. Also, bash wird nicht auf ctrl-r reagieren. Sie müssen bash als bash -i starten, um den interaktiven Modus zu erhalten.

(Und in dem seltenen Fall, dass Sie differnt Codierungen mit Sendern und Bash-Prozess verwenden, sicherzustellen, dass Sie mit dem Propper char-Code für ctrl-r.)

Ihr Beispiel Gegeben, so würde man nur müssen verwendet werden:

p = subprocess.Popen(['bash', '-i'], stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, stderr=subprocess.PIPE); 

zu Bash im interaktiven Modus gestartet (mit Zeilenbearbeitung aktiviert). Dann (unter der Annahme einer ASCII-kompatiblen Kodierung) können Sie (wie Sie bereits angenommen haben):

, um die Suchfunktion zu starten. (Natürlich unter der Annahme bezeichnet Standard des Bash-Subprozesses.)

+0

Es wäre toll, wenn es ein funktionierendes Snippet gibt. – zjk

Verwandte Themen