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

2024-10-03 06:22:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图打开一个可执行文件来打开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=子流程.管道当我看到上面的代码时,它是空白的。当我使用stdout或sterr时,程序只打开和关闭。在

我还尝试过在stdin=PIPE打开时使用以下代码:

^{pr2}$

但是,它没有读取程序中的任何内容。这个程序像命令提示符一样运行,但是它不是典型的cmd,因为它被用来读取DSS文件类型并生成一个文本文件,其中包含来自搜索的列表,比如命令行变量

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


Tags: 文件代码命令程序txt内容exesubprocess
1条回答
网友
1楼 · 发布于 2024-10-03 06:22:10

@tdelaney,@eryksun谢谢你的评论,你对管道和延迟的评论真的很有帮助。我可以使用以下代码解决问题:

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

通过使用管道与程序对话并设置一个时间延迟似乎解决了问题,并允许我与控制台进行对话。即使控制台显示为空白,但通过打印communicate()命令,它也会输出控制台所做的并生成包含所需序列的文本文件。在

谢谢你把我推向正确的方向!在

相关问题 更多 >