Взаимодействовать с Windows CMD в Python - PullRequest
0 голосов
/ 13 сентября 2018

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

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

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

proc.communicate('cd Documents')

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

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

1 Ответ

0 голосов
/ 13 сентября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...