如何使用Python子进程将多个输入写入自定义exe程序

时间:2016-11-01 20:09:44

标签: python windows python-2.7 input subprocess

我正在尝试打开一个打开HEC .dss数据库文件的可执行文件。但是,在打开exe之后我似乎只能读取一个参数然后它没有读取任何其他内容。有没有办法强迫它继续插入命令。

这个exe有一些独特的功能,包括第一个命令询问你要读取的DSS文件。然后,您可以输入一个命令来创建输出txt文件,该文件将写入其余命令。到目前为止我能够做的是启动程序并在exe中运行一个命令( mydss 变量)。但是,在读取第一个命令之后,命令提示符中不会使用任何其他命令。我觉得我在这里遗漏了一些东西。这是代码:

##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)

我也尝试过包含 stdin = subprocess.PIPE ,但这只会导致exe打开并且它是空白的(当我用上面的代码打开它时我可以读取它并且看到mydss变量被正确读取了)。当我使用 stdout sterr 时,程序只会打开和关闭。

stdin = PIPE 打开时,我也尝试使用该代码:

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

然而,它没有阅读该程序中的任何内容。此程序像命令提示符一样运行,但它不是典型的cmd,因为它是读取DSS文件类型并生成一个文本文件,其中的列表来自 commandLine 变量中的搜索

很高兴知道我可以做些什么来修复代码,以便我可以输入额外的命令。任何帮助知道如何事件检查命令是否由此exe发送或处理。最后,我将向exe文件添加更多命令以打印到文本文件,因此如果有任何方法可以让python写入exe文件,那将有所帮助。

1 个答案:

答案 0 :(得分:0)

@tdelaney,@ yieksun感谢您的评论,您对管道和延迟的评论确实有帮助。我能够通过使用此代码解决问题:

##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

通过使用管道与程序通信并且延迟时间似乎可以解决问题,并允许我与控制台通信。即使控制台显示为空白,通过打印communic()命令,它会输出控制台所执行的操作并生成带有所需系列的文本文件。

感谢你推动我朝着正确的方向前进!