Я пытаюсь открыть окно CMD и прочитать/записать в него. Мне удалось открыть CMD с помощью этой команды:
import subprocess
proc = subprocess.Popen('cmd.exe')
Чтобы написать в консоли CMD, я попробовал решение из этого вопроса:
proc.communicate('cd Documents')
Эта строка автоматически закрыла CMD, поэтому я не смог проверить, работает ли она.
Как я могу читать и писать в Windows CMD?
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()
это отправляет команды, сбрасывает стандартный ввод (но не закрывает его), затем ожидает, пока будут печататься сообщения, и попросит нажать клавишу. После этого вы можете посылать больше команд, если вы каждый раз стираете и закрываете в конце.