Wie bekomme ich die Ausgabe von meiner .exe mit Teilprozess und Popen?
Ich bin versucht, eine ausführbare Datei auszuführen, und erfassen dessen Ausgang mit subprocess.Popen
; aber ich weiß nicht zu sein scheinen immer alle ausgegeben.
import subprocess as s
from subprocess import Popen
import os
ps = Popen(r'C:\Tools\Dvb_pid_3_0.exe', stdin = s.PIPE,stdout = s.PIPE)
print 'pOpen done..'
while:
line = ps.stdout.readline()
print line
Druckt es zwei Linien weniger als die original-exe-Datei, wenn manuell geöffnet.
Habe ich versucht einen alternativen Ansatz, mit dem gleichen Ergebnis:
f = open('myprogram_output.txt','w')
proc = Popen('C:\Tools\Dvb_pid_3_0.exe ', stdout =f)
line = proc.stdout.readline()
print line
f.close()
Kann jemand bitte helfen Sie mir, um Daten von der exe?
Da fragte Sebastian:
Original-exe-Datei die letzten Zeilen o/p:
-Gdd): Allgemeine Zählung (1 - 1000)
-Cdd : Schnitt Anfang an (0 - 99)
-Edd : Schnitt-Ende an (1 - 100)
Bitte wählen Sie die stream-Datei-Nummer unter:
1 - .\pdsx100-bcm7230-squashfs-sdk0.0.0.38-0.2.6.0-prod.sao.ts
O/p bekomme ich nach der Ausführung:
-P0xYYYY : Pid been interested
-S0xYYYY : Service-ID-Interesse
-T0xYYYY : Transport-ID interessiert
-N0xYYYY : Netzwerk-ID interessiert
-R0xYYYY : Eine alte Pid wurde ersetzt durch das PID
-Gdd): Allgemeine Zählung (1 - 1000)
Damit wir sehen können, einige Linien fehlen. Ich Schreibe 1 und dann Wert nach wählen Sie bitte die fule Zahl unten angezeigt.
Ich versuche mit ps.stdin.write('1\n'). Es hat nicht drucken Sie den Wert in der exe-Datei
Neuen code:
#!/usr/bin/env python
from subprocess import Popen, PIPE
cmd = r'C:\Tools\Dvb_pid_3_0.exe'
p = Popen(cmd, stdin=PIPE, stdout=None, stderr=None, universal_newlines=True)
stdout_text, stderr_text = p.communicate(input="1\n\n")
print("stdout: %r\nstderr: %r" % (stdout_text, stderr_text))
if p.returncode != 0:
raise RuntimeError("%r failed, status code %d" % (cmd, p.returncode))
Dank Sebastien. Ich bin in der Lage zu sehen, die gesamte Ausgabe, aber nicht in der Lage zu füttern, in jedem Eingang mit dem aktuellen code.
stdout
und nicht stderr
?Tippfehler in deinem ersten Beispiel, Einzug nach der
while
oder ist dein code wirklich so?Ja Tippfehler es ist zwar wahr: während der Bearbeitung entfernt wurde
InformationsquelleAutor Ajith | 2012-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bekommen alle stdout als string:
Man sowohl stdout und stderr als eine einzelne Zeichenfolge:
Um alle Zeilen als Liste:
Bekommen Linien, wie Sie gedruckt werden durch den Unterprozess:
Hinzufügen
stderr=STDOUT
zu denPopen()
Aufruf von merge stdout/stderr.Hinweis: wenn
cmd
verwendet block-buffering in den nicht-interaktiven Modus, dann sind die Linien nicht angezeigt, bis der Puffer geleert.winpexpect
Modul in der Lage sein könnte, um die Ausgabe früher.Speichern Sie die Ausgabe in eine Datei:
Wenn
cmd
erfordert immer die Eingabe auch leere;stdin
:Könnten Sie kombinieren diese Lösungen z.B. zu verschmelzen stdout/stderr, und speichern Sie die Ausgabe in eine Datei, und einen leeren input:
Bieten alle Eingaben als eine einzelne Zeichenfolge, die Sie nutzen könnten
.communicate()
Methode:wo
test.py
:Wenn Ihr die Interaktion mit dem Programm ist mehr wie ein Gespräch als Sie brauchen
winpexpect
- Modul. Hier ist ein Beispiel auspexpect
docs:Senden spezielle Tasten wie
F3
,F10
auf Windows müssen Sie möglicherweiseSendKeys
- Modul oder seiner reinen Python-ImplementierungSendKeys-ctypes
. So etwas wie:Es nicht erfassen Ausgabe.
from subprocess import check_output as qx
Was bedeutetqx
stehen?x
ausführen,q
Zitat: ` Herkunft backquotes in bashqx''
- operator in perl.Hallo Sebastian, Vielen Dank für die Zeit und Mühe, die Antworten zu liefern. Ich habe versucht, dein script 1), Um Linien, wie Sie gedruckt sind, durch die subproces, 2)Zum speichern der Ausgabe in einer Datei. Sowohl die Skripte gab mir die gleiche Antwort wie vor die zwei Zeilen weniger. Konnte nicht verstehen, wie Sie schreiben, die Eingänge sind mit Ihrem Skript .Können Sie bitte erklären.. Vielen Dank agaain
Haben Sie versucht
stderr=STDOUT
wie im 2. Beispiel? Sind diese zwei fehlenden Zeilen so etwas wie ein Kennwort fordert (man könnte Sie werden direkt auf die Konsole geschrieben (außerhalb stdout, stderr))? Wollen Sie alle Eingaben auf einmal, und Lesen Sie die ganze Ausgabe aus dem Programm oder ist das zusammenspiel eher wie ein Gespräch (vor und zurück)? Wie groß sind die input/output? Aktualisieren Sie Ihre Frage mit der info. Könnten Sie einen Kommentar hinterlassen, wenn Sie mich wollen, um benachrichtigt zu werden.Zweites Beispiel. Das Skript wartet etwas nach Ausführung.Fehlermeldung nach der Tastatur-interrupt- " C:\Tools>python DVB.py Traceback (most recent call last): File "DVB.py", line 16, in <module> - Ausgabe = qx(cmd, stderr=STDOUT) - Datei "C:\Python27\lib\subprocess.py" Linie 538, in check_output Ausgabe, unused_err = Prozess.kommunizieren() File "C:\Python27\lib\subprocess.py" Linie 746, kommunizieren, stdout = _eintr_retry_call(selbst.stdout.Lesen) - Datei "C:\Python27\lib\subprocess.py" Linie 478, in _eintr_retry_call return func(*args) KeyboardInterrupt
InformationsquelleAutor jfs
Den Einzug Ihrer Frage warf mich ein bisschen, da Python ist über, die. Haben Sie versucht, etwas so:
Ich denke, dass
stdout
wird aus einem einzigen string, was Sie wieder von Ihrem Befehl, so kann dies nicht sein, was Sie sich wünschen, dareadline()
setzt Sie anzeigen möchten, die Ausgabe-Zeile für Zeile.Würde vorschlagen, stochern http://docs.python.org/library/subprocess.html für einige Anwendungen, die mit dem übereinstimmen, was Sie sind bis zu.
Nochmals vielen Dank. Sehr hilfreich, aber es hat nicht funktioniert
InformationsquelleAutor terryjbates