Как взаимодействовать с исполняемым файлом с Python - PullRequest
1 голос
/ 26 июня 2019

У меня есть исполняемый файл, который принимает ввод с клавиатуры и возвращает ответ на основе введенного текста.При попытке прочитать вывод, возвращенный exe, скрипт python зависает.

Я использую Windows 7 и python3.7.Я попытался ответить на вопрос , постоянно взаимодействующий с файлом .exe с помощью python .

from subprocess import Popen, PIPE

location = "C:\\Users\\file.exe"

p= Popen([location],stdin=PIPE,stdout=PIPE,stderr=PIPE, encoding="UTF8")
command='START'
p.stdin.write(command)
response=p.stdout.read()

. Я ожидаю, что ответ будет заполнен выходным текстом, но вместо этого программа зависнет в этой строке.

exe-файл, с которым я хочу взаимодействовать: здесь (файл EMBRYO)

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Кажется, что стандартный вывод не выполнялся, так как стандартный вывод не выполнялся после вызова p.stdin.flush () все работало!

from subprocess import Popen, PIPE

location = "C:\\Users\\file.exe"

p= Popen(location,stdin=PIPE,stdout=PIPE,stderr=PIPE, encoding="UTF8")
command='START\n'
p.stdin.write(command)
p.stdin.flush()  # important
response=p.stdout.read()

Спасибо всем, кто помог:)

0 голосов
/ 26 июня 2019

Звоните p.stdout.readline() вместо p.stdout.read().Это даст вам по одной строке за раз, вместо того, чтобы ждать, пока процесс закроет свою трубу стандартного вывода.Для получения дополнительной информации прочитайте документацию .

Вот более подробный пример.Представьте, что этот скрипт заменяет ваш exe-файл:

# scratch.py
from time import sleep

for i in range(10):
    print('This is line', i)
    sleep(1)

Теперь я запускаю этот скрипт и пытаюсь прочитать его вывод:

from subprocess import Popen, PIPE, STDOUT

p = Popen(['python', 'scratch.py'], stdin=PIPE, stdout=PIPE, stderr=STDOUT, encoding='UTF8')
for i in range(10):
    response = p.stdout.read()
    print('Response', i)
    print(response)

Результаты выглядят так: он ждетдесять секунд, затем распечатывает следующее:

Response 0
This is line 0
This is line 1
This is line 2
This is line 3
This is line 4
This is line 5
This is line 6
This is line 7
This is line 8
This is line 9

Response 1

Response 2

Response 3

Response 4

Response 5

Response 6

Response 7

Response 8

Response 9

Теперь, если я изменю его на readline(), я получу это:

Response 0
This is line 0

Response 1
This is line 1

Response 2
This is line 2

Response 3
This is line 3

Response 4
This is line 4

Response 5
This is line 5

Response 6
This is line 6

Response 7
This is line 7

Response 8
This is line 8

Response 9
This is line 9
...