python-subprocess.Popen stdin.schreiben
Ich bin neu in python und möchte öffnen Sie unter windows eine cmd-Eingabeaufforderung, starten Sie einen Prozess, lassen Sie den Prozess ausführen und dann Befehle zu dem gleichen Laufenden Prozess.
Werden die Befehle ändern so kann ich nicht einfach diese Befehle in die variable cmdline unten. Auch dauert das 10-15 Sekunden zum starten, so dass ich nicht wollen, Zeit zu verschwenden, warten auf den Prozess zu starten und Befehle ausführen jedes mal. will einfach nur zu starten sobald. und führen Sie schnelle Befehle nach Bedarf in den gleichen Prozess
Ich hatte gehofft, zu verwenden subprocess.Popen
um diese Arbeit zu machen, aber ich bin offen für bessere Methoden. Beachten Sie, dass mein Prozess zu laufen, ist nicht cmd, aber ich bin einfach mit dieser als Beispiel
import subprocess
cmdline = ['cmd', '/k']
cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
cmd.stdin.write("echo hi") #would like this to be written to the cmd prompt
print cmd.stdout.readline() #would like to see 'hi' readback
cmd.stdin.write("echo hi again") #would like this to be written to the cmd prompt
print cmd.stdout.readline() #would like to see 'hi again' readback
Die Ergebnisse sind nicht das, was ich erwarte. Scheint, als ob die stdin.schreiben Sie Befehle, die nicht eigentlich immer in und die readline friert, mit nichts zu Lesen.
Habe ich versucht das popen.communicate()
statt schreiben/readline, aber es killt den Prozess. Ich habe versucht Einstellung bufsize in den Popen Linie, aber das hat nicht zu viel Unterschied
Also ich machte einige Fortschritte... machen es den Befehl cmd ein.stdin.write("...\n"), mit dem neue-Zeile wird die Eingabe und lässt den Prozess in der Lage mehrere Befehle in. Nun mein problem ist die Automatisierung der einzelnen Schritte erforderlich. Manuell ausführen, ich Laufe .bat-Datei mit öffnet sich ein cygwin-terminal (mit einem $ - prompt). Ich rufen Sie ein Programm, das ist mehr oder weniger eine tcl-shell (mit % - Eingabeaufforderung). Was ich jetzt noch tun müssen, ist irgendwie der cmd.stdin,schreiben zu imitieren, um mir die Eingabe direkt an die tcl - % - Eingabeaufforderung. das ist, wo ich in jetzt... irgendwelche Ideen?
don ' T Kommentar auf Ihre eigene Frage, die es zu aktualisieren, oder stellen Sie eine neue ein, anstatt (deine Frage gezogen werden sollten, ohne zu Lesen alle Kommentare).
Ich glaube nicht, dass es dauert 10-15 Sekunden zum starten einer neuen cmd auf einem modernen computer. Wenn Sie den tatsächlichen Befehl ist nicht
cmd
; so zu sagen. Die Pufferung Verhalten hängt stark davon ab, einen bestimmten Teilprozess (wie es interagiert mit seiner stdin/stdout oder ob es nutzt Ihnen überhaupt z.B. ein Unterprozess konnte direkt schreiben, um die Windows-Konsole mittels WriteConsoleW
(obwohl, wenn die Ausgabe umgeleitet; sollte es nicht).ok, heres, was ich versuche zu tun.... Ich habe einige code läuft auf einem Altera FPGA, dass die Gespräche zu meinem Prüfling. Ich brauche verlagern einen großen Teil der Daten aus dem FPGA nach der fertigen Aufnahme aus meinem Prüfling. Ich fand eine nette Funktion innerhalb Altera "system console", die mir erlaubt, schnell schnappen Sie sich diese große Stück, und schreiben eine binäre Datei, die für die Nachbearbeitung. Also das Altera "System Konsole" läuft tcl-Skripten. die hat eine % - Eingabeaufforderung. Im Versuch verwenden Sie popen oder pexpect man, % - Eingabeaufforderung.
InformationsquelleAutor pyNewbie | 2015-05-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Kommentare deuten darauf hin, dass Sie sind verwirrend Kommandozeilen-Argumente, mit Eingabe via stdin. Nämlich die Tatsache, dass
system-console.exe
Programm akzeptiertscript=filename
parameter bedeutet nicht, dass Sie senden können Sie die gleiche Zeichenfolge als Befehl über stdin z.B.python
ausführbare akzeptiert-c "print(1)"
Kommandozeilen-Argumente, aber es ist einSyntaxError
wenn Sie übergeben Sie es als Befehl, um die Python-shell.Daher der erste Schritt ist, um die richtige syntax verwenden. Nehmen wir an, die
system-console.exe
einen Dateinamen akzeptiert, die von sich selbst:Hinweis: wenn Sie umgeleitet haben mehr als einen stream z.B. stdin, stdout, dann sollten Sie Lesen/schreiben, beide streams gleichzeitig (z.B. mehrere threads verwenden), ansonsten ist es sehr leicht zu deadlock Ihrem Programm.
Verwandte:
subprocess
,pexpect
Module.Den zweiten und die folgenden Schritte vielleicht zu tun haben mit Pufferung Probleme auf der Seite der Kind-Prozess (out-of Ihre Hände unter Windows), ob
system-console
ermöglicht das umleiten Ihre stdin/stdout oder ob es arbeitet mit einer Konsole direkt, und die character-encoding-Probleme (wie die verschiedenen Befehle in der pipeline codieren von text).sollten Sie verwenden
shell.stdin.flush()
auf Python 2 (Hinweis:flush=True
oben). Auchstdout
ist nicht umgeleitet werden (Sie sollten sehen, die Ausgabe in der Windows-Konsole). Um zu überprüfen, ob es Umleitungen: 1. Umleiten 2. Holen Sie sich das Ergebnis (z.B. mitoutput, err = p.communicate(input)
) - wenn Sie immer noch sehen, die Ausgabe oder hängt sich das System auf eine Eingabe wartet, dann die Umleitung fehlgeschlagen ist.J. F. Sebastian: ich fügte hinzu, in den stdin.flush(). kein Unterschied in der Ausführung. In Bezug auf die Umleitung, die ich nicht bekommen, jede Ausgabe auf den Bildschirm. Wenn ich weder den stdin=PIPE noch den stdout=PIPE, dann bekomme ich auf dem Bildschirm ausgegeben. Ich habe versucht, mit nur stdin=PIPE (kein stdout=PIPE) vor ein paar Tagen denken, dass es erlauben würde, stdin input und noch die Ausgabe auf den Bildschirm. Aber das hat nie geklappt.
so habe ich herausgefunden, dass die system-Konsole benötigt ein zusätzliches argument übergeben, um es in einem bestimmten Modus (--disable_readline) zum ausführen des capture-Skripte. So, nachdem alle, die python-code wurde wie vorgesehen funktioniert (nachdem das \n-Zeichen) vielen Dank für Eure Hilfe Jungs!!
So anscheinend Sie versehentlich löste mein anderes problem der Verwendung von nicht
universal_newlines
. Danke!InformationsquelleAutor jfs
Müssen Sie die Verwendung von iter-wenn Sie möchten, um zu sehen, die Ausgabe in Echtzeit:
Nicht sicher, was genau Sie zu tun versuchen, aber wenn Sie wollen, um die Eingabe bestimmter Daten, wenn Sie bestimmte Ausgabe dann würde ich empfehlen, mit pexpect
haben Sie versucht, läuft pexpect mit cygwin cygwin.com
ich habe versucht, techi2teach.blogspot.com/2011/01/..., aber habe ähnliche Fehler, YingWang haben. später gelesen, dass diese Installation wurde überprüft, auf XP. im Laufenden Win7. Wenn Sie wissen, wie zu installieren pexpect mit cygwin auf Win7, im Spiel zum Einsatz. es sieht sehr schön aus, aber jetzt im nicht sicher, es wird sich durchsetzen werden, weil der windows. Irgendwelche Ideen, warum kann ich nicht bekommen Teilprozess zu Lesen in mehreren stdin schreibt? I dont care über die readbacks so viel
installiert, so dass Sie cygwin erfolgreich oder nicht? Auch sind Sie zur Eröffnung mehrerer shells?
ja, cygwin installiert ist, funktioniert ok. es ist nur eine Frage der immer pexpect arbeiten mit win7. klingt wie ein großartiges Werkzeug, aber ich laufen in Probleme, denn ich habe termios und ich habe etwas namens Ressourcen. Ill Blick wieder für pexpect installieren Sie die Hilfe von win 7. Ich bin nur öffnen, 1-shell. aber ich bin aufrufende Prozess Ein, dann Prozess B und wollen, um Befehle senden zu Prozess B. ich brauche, um zu simulieren, Tippen auf diese % - Eingabeaufforderung. Seine Altera-System-Konsole, in den Fall, jemand hat Erfahrung danke
InformationsquelleAutor Padraic Cunningham
Hier ist etwas code, den ich getestet und funktioniert auf Windows 10, Quartus Prime 15.1 und Python 3.5
InformationsquelleAutor Luke Beno