communicate
отправляет содержимое буфера на стандартный ввод, затем закрывает канал ввода, что в итоге завершает процесс. Таким образом, вы не можете сделать что-то интерактивное с этим.
Более того, вы должны передать stdin
аргумент Popen
или по умолчанию ничего не перенаправлено.
import subprocess
proc = subprocess.Popen('cmd.exe',stdin=subprocess.PIPE)
теперь вы можете записывать строки в proc.stdin
(не забывайте о разделителях строк и двоичном префиксе для Python 3 Compat.) И смотрите, что происходит
proc.stdin.write(b"cd Documents\n")
(хорошо, вы могли бы использовать cwd="Documents"
для этого, но это ради примера)
В этом примере вывод не перенаправлен. Это означает, что вы увидите вывод в текущей консоли. Не забудьте close
стандартный ввод, иначе это не сработает (возможно, из-за того, что буфер не очищен и / или канал не работает при выходе из Python). Затем дождитесь окончания процесса с wait()
Полный пример:
import subprocess
proc = subprocess.Popen('cmd.exe',stdin=subprocess.PIPE)
proc.stdin.write(b"cd ..\n")
# do some stuff in between...
proc.stdin.write(b"cd\n")
proc.stdin.close()
proc.wait()
на моем компьютере он печатает (извините, мой французский)
Microsoft Windows [version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.
L:\so>cd ..
L:\>cd
L:\
если вы хотите, чтобы процесс не завершался, вы можете использовать еще несколько хитростей:
подпроцесс импорта, время
proc = subprocess.Popen('cmd.exe',stdin=subprocess.PIPE)
proc.stdin.write(b"cd ..\n")
proc.stdin.write(b"cd\n")
proc.stdin.flush()
time.sleep(1)
input("press return")
proc.stdin.write(b"cd\n")
proc.stdin.flush()
proc.stdin.close()
proc.wait()
это отправляет команды, сбрасывает стандартный ввод (но не закрывает его), затем ожидает печати сообщений и запрашивает нажатие клавиши. После этого вы можете отправлять больше команд, если вы каждый раз сбрасываете и закрываете в конце.