comunicate будет запущен только один раз , а затем закроет канал, поэтому, если вы хотите отправить ему несколько команд, вам нужно отправить одну за другой в та же строка .
Вот пример, который сработал для меня после некоторого исследования, пробуя потоки, subprocess32, stdin.write, stdout.read и т. Д. И т. Д. Эта информация отсутствует в официальной справочной информации Python для связи: https://docs.python.org/2/library/subprocess.html
Единственное место, где я это узнал, было здесь:
Связь с подпроцессом Python убивает мой процесс
В любом случае вот код, простой, без потоков, без подпроцесса32, работает на Linux и Windows. Да, вы должны знать, сколько раз отправлять команды другому процессу, но в целом вы это знаете. Вдобавок к этому вы можете добавить потоки, cwd, shell = True или все, что вам нужно, но это самый простой случай:
def do_commands(self, cmd, parms):
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE )
# wait for the process to terminate
out, err = process.communicate(cmd_parms)
errcode = process.returncode
return errcode, out, err
Так, например, если вы хотите отправить несколько возвратов каретки (\ n) вызываемому приложению и параметру в середине (обратите внимание, в интерактивном режиме), вы бы назвали его примерно так:
cmd_parms = "\n\n\n\n\nparm\n\n"
errcode, out, err = do_commands(command, cmd_parms)