Проблема с использованием Python subprocess.communicate () в Windows - PullRequest
0 голосов
/ 28 октября 2009

У меня есть приложение, которым я пытаюсь управлять через Python и модуль подпроцесса. По сути, я запускаю приложение с помощью Popen (который открывает командную строку, в которой выполняется программа), а затем в какой-то момент времени позже в процессе выполнения мне нужно отправить строку (команду) на STDIN этой программы , Это работает нормально, за исключением того факта, что команда не будет обработана, пока я вручную не введу кнопку в командном окне приложения, запущенного Python. Вот часть моего кода:

cmd = 'quit\n'
app.communicate(cmd.encode('utf-8'))

Есть идеи?

РЕДАКТИРОВАТЬ # 1

Да, нажатие кнопки означает нажатие клавиши на клавиатуре, извините за путаницу. Я прикрепил больше моего кода ниже

app = Popen(['runProg.exe', '-m', '20'], stdin=PIPE, universal_newlines=True)
while not os.path.exists('C:/temp/quit-app.tmp'): time.sleep(1)
app.communicate('quit')
os.remove('C:/temp/quit-app.tmp')

Итак, что должно произойти, программа должна работать до тех пор, пока не будет создан файл quit-app.tmp; после того, как он создан, «quit» должен быть отправлен в приложение, которое является командой для его корректного завершения работы. Если бы человек запускал эту программу, он сделал бы это, просто набрав «quit» в командном окне. Спасибо!

1 Ответ

0 голосов
/ 28 октября 2009

попробовать:

cmd = 'quit\n\r'

EDIT:

Единственное, что у меня работает, это:

app = subprocess.Popen(["cmd.exe","testparam"],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
app.stdin.write('exit\r\n')

Потому что как документация говорит:

Popen.communicate (вход = нет)

Взаимодействовать с процессом: Отправить данные STDIN. Чтение данных из стандартного вывода и stderr, пока не будет достигнут конец файла. Дождаться завершения процесса . необязательный входной аргумент должен быть строка для отправки ребенку Process, или None, если данные не должны быть отправлено ребенку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...