Я пытаюсь открыть исполняемый файл, который открывает файл базы данных HEC .dss. Тем не менее, я могу только заставить его прочитать один аргумент после открытия exe, а затем он ничего не читает. Есть ли способ заставить его продолжать вставлять команды.Как использовать подпроцесс Python для записи нескольких входов в пользовательскую программу 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, но это приводит лишь к открытию ехе и он пустой (когда я открываю его с кодом выше, я могу читать это и увидеть, что переменная mydss была прочитана правильно). Когда я использовал stdout или sterr, программа открывается и закрывается.
Я также попытался с помощью кода, когда STDIN = PIPE был включен с:
ps.stdin.write(myList[1])
ps.stdin.write(myList[0])
ps.communicate()[0]
Однако, это ничего в программе не читать. Эта программа работает как в командной строке, однако, это не типичный CMD, как это было сделано, чтобы читать типы файлов DSS и производить текстовый файл со списком из поисков, как в CommandLine переменной
Было бы неплохо знаю, что я могу сделать, чтобы исправить код, чтобы я мог вводить дополнительные команды. Любая помощь, чтобы знать, как проверить событие, если команды были отправлены или обработаны этим exe. В конце концов, я добавлю еще много команд в exe-файл для печати в текстовый файл, поэтому, если есть способ получить питон для записи в exe, который поможет.
Его интерактивная программа, и вы хотите управлять этим взаимодействием с python? Это было бы возможно в системах Linux, использующих модуль 'pexpect' намного сложнее для окон. Существует [ограниченная поддержка] (http://pexpect.readthedocs.io/en/stable/overview.html#pexpect-on-windows), но я не знаю, будет ли это работать для вас. – tdelaney
Его общая для интерактивных программ также имеет интерфейс сценариев. Если ваша программа делает это, вы можете написать команду stdin, чтобы получить то, что вы хотите. – tdelaney
@tdelaney, это часто возможно с помощью API консоли в расширении C или через ctypes. Если родительский процесс подключен к той же консоли, что и дочерний, то он может записывать входной буфер консоли и читать из активного экранного буфера консоли. – eryksun