【发布时间】:2017-03-15 01:14:03
【问题描述】:
我正在尝试打开可打开 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 会有所帮助。
【问题讨论】:
-
它是一个交互式程序,您想驱动与 python 的交互吗?这在使用
pexpect模块的Linux 系统上是可能的,在Windows 上要困难得多。有some limited support,但我不知道它是否适合你。 -
交互式程序通常也有脚本接口。如果您的程序这样做,那么您可以向标准输入写入命令以获得您想要的。
-
@tdelaney,通常可以在 C 扩展或通过 ctypes 中使用控制台 API。如果父进程与子进程连接到同一个控制台,则它可以写入控制台的输入缓冲区并从控制台的活动屏幕缓冲区中读取。
-
@eryksun - 是的......但是您必须跟踪缓冲区并轮询它以进行更改,这是一项繁重的工作!即便如此,windows libc 仍认为它是一个管道,如果程序是基于 libc 的,它的行为可能会有问题。
-
@tdelaney,对您的第一个响应是肯定的,尽管您可以创建一个包含 9999 行的新屏幕缓冲区,所有这些都使用 NUL 进行初始化,以便于从屏幕上读取行(在许多情况下)。大多数控制台程序都是面向行的,而不是主动绘制屏幕的 curses 样式程序,因此等待控制台句柄并跟踪光标位置就足够了。当控制台必须滚动缓冲区时,这将是一个沉重的负担。第二条评论对我来说没有意义。 CRT 不会将控制台句柄视为管道。
标签: python windows python-2.7 input subprocess