Взаимодействовать с Windows CMD в Python

1

Я пытаюсь открыть окно CMD и прочитать/записать в него. Мне удалось открыть CMD с помощью этой команды:

import subprocess
proc = subprocess.Popen('cmd.exe')

Чтобы написать в консоли CMD, я попробовал решение из этого вопроса:

proc.communicate('cd Documents')

Эта строка автоматически закрыла CMD, поэтому я не смог проверить, работает ли она.

Как я могу читать и писать в Windows CMD?

Теги:
cmd
subprocess

1 ответ

1
Лучший ответ

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()

это отправляет команды, сбрасывает стандартный ввод (но не закрывает его), затем ожидает, пока будут печататься сообщения, и попросит нажать клавишу. После этого вы можете посылать больше команд, если вы каждый раз стираете и закрываете в конце.

  • 0
    Я попробовал твой код, и он не сработал для моего. Консоль все еще закрыта после строки: proc.stdin.write (b "Документы cd \ n")
  • 0
    попробуйте полный пример
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню