2016-11-01 2 views
0

Ich versuche, eine ausführbare Datei zu öffnen, die eine HEC .dss-Datenbankdatei öffnet. Ich kann jedoch nur scheinbar ein Argument lesen, nachdem ich die exe geöffnet habe, und dann liest es nichts anderes mehr. Gibt es eine Möglichkeit, es zu zwingen, Befehle einzufügen?Wie Python-Subprozess verwenden, um mehrere Eingaben in benutzerdefinierte EXE-Programm schreiben

Diese Exe hat einige einzigartige Eigenschaften, die beinhalten, dass der erste Befehl fragt, welche DSS-Datei Sie lesen werden. Dann können Sie einen Befehl eingeben, um die Ausgabe-TXT-Datei zu erstellen, die für den Rest der Befehle geschrieben wird. Was ich bisher tun konnte, ist das Programm zu starten und einen Befehl in die exe (mydss Variable) auszuführen. Nachdem jedoch der erste Befehl gelesen wurde, wird keiner der anderen Befehle in der Eingabeaufforderung verwendet. Ich fühle mich, als würde ich hier etwas vermissen. Hier ist der Code:

##Testing on how to run and use the DSSUTL program 
import subprocess 
from subprocess import PIPE, STDOUT 

DSSUTL = "C:\Users\sduncan\Documents\HEC-DSS\HEC-DSSVue-2_0_1\FromSivaSel\DSSUTL.exe" 
mydss = "C:\Users\sduncan\Documents\HEC-DSS\HEC-DSSVue-2_0_1\FromSivaSel\\forecast.dss" 
firstLine = "WR.T TO=PythonTextOutput.txt" 
commandLine = "WR.T B=SHAVER RESERVOIR-POOL C=FLOW-IN E=1HOUR F=10203040" 
myList = [firstLine, commandLine] 
ps = subprocess.Popen([DSSUTL, mydss, myList[1], myList[0]], shell=True) 

ich auch habe versucht, einschließlich stdin = subprocess.PIPE, aber das führt nur zu der EXE-Datei öffnen und es ist leer (wenn ich es mit dem Code öffnen oben wir lesen können es und sehe, dass die mydss-Variable richtig gelesen wurde). Wenn ich stdout oder sterr verwende, wird das Programm nur geöffnet und geschlossen.

ich auch den Code versucht haben, zu verwenden, wenn die stdin = PIPE auf mit gedreht wurde:

ps.stdin.write(myList[1]) 
ps.stdin.write(myList[0]) 
ps.communicate()[0] 

Allerdings hat es nichts in das Programm eingelesen. Dieses Programm läuft wie eine Eingabeaufforderung, aber es ist nicht das typische cmd wie es gemacht wurde die DSS Dateityp und erzeugen eine Textdatei mit der Liste von Suchanfragen wie in der command Variable

Es wäre schön zu lesen Ich weiß, was ich tun könnte, um den Code zu reparieren, damit ich die zusätzlichen Befehle eingeben kann. Jede Hilfe, um zu wissen, wie ein Ereignis überprüft wird, ob die Befehle von dieser exe gesendet oder verarbeitet wurden. Schließlich werde ich der exe-Datei noch viele weitere Befehle hinzufügen, um sie in die Textdatei zu schreiben. Wenn es also irgendeinen Weg gibt, Python in die exe zu schreiben, würde das helfen.

+0

Es ist ein interaktives Programm und Sie wollen diese Interaktion mit Python fahren? Dies wäre auf Linux-Systemen möglich, die das 'pexpect'-Modul viel schwieriger auf Windows verwenden. Es gibt [einige begrenzte Unterstützung] (http://expect.readthedocs.io/en/stable/overview.html#pexpect-on-windows), aber ich weiß nicht, ob es für Sie funktioniert. – tdelaney

+0

Es ist üblich, dass interaktive Programme auch eine Skriptschnittstelle haben. Wenn Ihr Programm das tut, können Sie vielleicht einen Befehl in stdin schreiben, um zu bekommen, was Sie wollen. – tdelaney

+0

@tdelaney, ist es oft möglich, die Konsole API in einer C-Erweiterung oder über Ctypes. Wenn der übergeordnete Prozess an dieselbe Konsole wie der untergeordnete angeschlossen ist, kann er in den Eingabepuffer der Konsole schreiben und aus dem aktiven Bildschirmpuffer der Konsole lesen. – eryksun

Antwort

0

@tdelaney, @eryksun Vielen Dank für Ihre Kommentare, Ihre Kommentare zu den Röhren und der Verzögerung haben wirklich geholfen. Ich war in der Lage, das Problem zu beheben, indem Sie diesen Code verwenden:

##Testing on how to run and use the DSSUTL program 
import subprocess 
from subprocess import PIPE, STDOUT 
import time 

DSSUTL = "C:\Users\sduncan\Documents\HEC-DSS\HEC-DSSVue-2_0_1\FromSivaSel\DSSUTL.exe" 
mydss = "C:\Users\sduncan\Documents\HEC-DSS\HEC-DSSVue-2_0_1\FromSivaSel\\forecast.dss" 
location = "WR.T TO=PythonTextOutput.txt" + " WR.T B=SHAVER RESERVOIR-POOL C=FLOW-IN E=1HOUR F=10203040" + "\n" 
filecontent1 = "WR.T B=FLORENCE RESERVOIR-POOL C=FLOW-IN E=1HOUR F=10203040" + "\n" 
filecontent2 = "WR.T B=HUNTINGTON LAKE-POOL C=FLOW-IN E=1HOUR F=10203040" + "\n" 
filecontentList = [filecontent1, filecontent2] 
myList = [DSSUTL, mydss] # commandLine, location 
ps = subprocess.Popen(myList , shell=False, stdin=PIPE, stdout=PIPE, stderr=STDOUT) 
time.sleep(1) 
# input into stdin 
ps.stdin.write(location) 
time.sleep(1) 
ps.stdin.write(filecontent1) 
time.sleep(1) 
ps.stdin.write(filecontent2) 
time.sleep(1) 
print ps.communicate()[0] 
# End Script 

Durch die Rohre mit dem Programm und setzt eine Zeitverzögerung zu sprechen schien das Problem zu beheben und mich erlaubt, an die Konsole zu sprechen. Auch wenn die Konsolenanzeige leer ist, wird durch das Drucken des Befehls communicate() der Inhalt der Konsole ausgegeben und die Textdatei mit der gewünschten Serie erstellt.

Danke, dass du mich in die richtige Richtung schiebst!

+0

Es sieht so aus, als würde die relevante Änderung hier ein nacheilendes "\ n" zu jeder Eingabezeile hinzufügen, das Sie stattdessen am Ende jedes Zeichenfolgenliterals, z. benutze '' string \ n'' anstelle von ''string' + '\ n''. Die 'sleep()' Aufrufe sollten nicht benötigt werden; du schreibst nur zu einer Pfeife. Sie sollten in der Lage sein, die 3 Zeichenfolgen zu verbinden und es als 'Eingabe'-Argument zum' Kommunizieren' zu schreiben. FYI, du sprichst * nicht mit einer Konsole; Jeder der 3 Standardgriffe ist ein Rohr. Eigentlich hast du 'stdout' und' stderr' die gleiche Pfeife gemacht, aber ich empfehle das in den meisten Fällen nicht. – eryksun

Verwandte Themen