#python #windows #python-2.7 #subprocess #command-prompt
#питон #Windows #python-2.7 #подпроцесс #командная строка #python
Вопрос:
Я пытался запустить некоторые приложения с аргументами в командной строке Windows, но в скрипте Python. Я сталкиваюсь с проблемами в понимании модуля подпроцесса и того, как я мог бы использовать его для отправки входных данных, захвата выходных данных и использования данных в будущих функциях или циклах.
Давайте возьмем, к примеру, командную строку инструментария управления Windows:
Я хотел бы запустить командную строку из скрипта Python, запустить wmic, выполнить некоторые действия, а затем вернуться к командной строке.
Я знаю, как настроить cmd и даже wmic:
import subprocess
cmd = subprocess.Popen(["cmd", "/K", "wmic"])
Чего я не знаю, так это как отправлять команды в wmic. Я попробовал следующее:
import subprocess
cmd = subprocess.Popen(["cmd", "/K", "wmic"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdoutdata, stderrdata = cmd.communicate(input="product get name")
или
cmd.stdin.write("product get name")
cmd.stdin.flush()
Не работает. Чего бы я хотел в этом примере, так это запустить командную строку, запустить WMIC, отправить команду (product / process get name), захватить выходные данные WMIC и использовать их для выполнения чего-либо:
for line in cmd.stdout:
if line == "some string":
do this or do that
В то же время я хотел бы, чтобы выходные данные были напечатаны в открывшейся командной строке.
Я был бы признателен за любую помощь.
Комментарии:
1. Возможно, программе не хватает новой строки в отправляемом вами «вводе»? И помните, что в Windows новая строка
"rn"
.2. Выполнить wmic.exe напрямую. Предпочтительно запускать отдельные команды. Не пытайтесь взаимодействовать с консольными приложениями в целом. Большинство использует полную буферизацию (обычно 4 КБ) при передаче стандартного вывода, что не может работать в интерактивном режиме, поскольку файловый буфер приложения должен заполниться перед сбросом в канал. В Windows нет ничего похожего на Linux
stdbuff
для управления буферизацией или псевдотерминалами. В последних версиях Windows 10 есть псевдоконсули, но кому сойдет с рук поддержка только последней версии ОС? Существуют такие программы, как winpty, которые опрашивают и очищают буфер экрана консоли, но это неэлегантно.3. @Какой-то программист чувак: похоже, это тоже не работает
4. @eryksun: Я не запускаю wmic, это был просто пример. Мне нужно запустить конкретное приложение, проверить его выходные данные и, основываясь на этом, запустить несколько сценариев.
5. Должно быть хорошо использовать
communicate
с пакетом команд, каждая из которых заканчивается"rn"
, как было предложено в первом комментарии. Все они будут записаны в stdin одновременно, в то время как рабочие потоки будут считывать данные из каналов stdout и stderr до завершения работы приложения. Просто не планируйте возможность взаимодействия с приложением, т. Е. Не пытайтесь последовательно записывать в stdin и читать из stdout, потому что его стандартный вывод, вероятно, буферизован, то есть, если у него нет опции командной строки для отключения буферизации или принудительного интерактивного режима.