Я хотел бы выполнить несколько команд в автономном приложении, запущенном из сценария Python, с помощью каналов. Единственным путем я мог надежно передать команды stdin программы, использовал Popen.communicate, но это закрывает программу после того, как команда выполняется. Если я использую Popen.stdin.write, чем команда выполняется только в 1 раз приблизительно из 5, это не работает надежное. Что я делаю неправильно?
Уточнить немного:
У меня есть приложение, которое слушает stdin для команд и выполняет их линию за линией. Я хотел бы иметь возможность запустить приложение и передать различные команды ему, на основе пользовательского взаимодействия с GUI. Это - простой тестовый пример:
import os, string
from subprocess import Popen, PIPE
command = "anApplication"
process = Popen(command, shell=False, stderr=None, stdin=PIPE)
process.stdin.write("doSomething1\n")
process.stdin.flush()
process.stdin.write("doSomething2\n")
process.stdin.flush()
Я ожидал бы видеть результат обеих команд, но я не получаю ответа. (Если я выполняю одну из строк Popen.write многократно, она иногда работает.)
И если я выполняюсь:
process.communicate("doSomething1")
это работает отлично, но приложение завершается.
Похоже, ваше приложение относится к входу от трубы в странном способе. Это означает, что он не будет получать все команды, которые вы отправляете, пока не закроете трубу.
Так что подход, который я предложил бы, это просто чтобы сделать это:
process.stdin.write("command1\n")
process.stdin.write("command2\n")
process.stdin.write("command3\n")
process.stdin.close()
Это не звучит, как ваша программа Python является чтением вывода из приложения, поэтому не должно иметь значения, если вы отправляете команды все сразу так Отказ