Форум сайта python.su
Люди, помогите пожалуйста. Очень нужно.
Запускаю процесс:
import subprocess
step1 = subprocess.Popen('cmd.exe', shell = True,
stdout = subprocess.PIPE, stdin=subprocess.PIPE, cwd = ‘C:\Windows\system32’ )
То есть идёт имитация работы с коммандной строкой. Но теперь мне нужно по очереди передавать комманды и считывать результаты во входящий файл.
Допустим, сначала я хочу выполнить комманду:
cd c:\Program
А потом комманду:
setenv.bat
После неё:
dir
Напишите пожалуйста в виде комманд, как это делается. Сколько разных вариантов испробовал и с communicate, и со stdin\stdout - тяжело вообразить.
P.S. Заменить cmd.exe на что-либо другое - не суть важно. Мне нужно само выполнение комманд в одном процессе.
Офлайн
Да говорюже - кривой путь =)
аргументы
env для уставновки окружения
cwd - для рабочего каталога - рулят
Отредактировано (Окт. 1, 2008 18:23:40)
Офлайн
Сделай батник и его запускай.
Офлайн
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Офлайн
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?Что значит “при чём батник”. Пишите батник где выполняете последовательно нужные команды и в нужной последовательности, и вызываете на питоне. Ловите stdout. Это - если заранее известна последовательность.
Офлайн
Можно но гимроно.
Вот ты когда в консоли запускаешь команды по очереди.
Ты запускаешь команду. Ждешь ее выполнения (визуально - т.е. видишь что строчки бежать перестали), после этого даешь следующую. Тоже придется делать и в питоне. Парсить вывод команды и тогда давать следующую.
Офлайн
orionДа тыж всеравно батник запускаешь, в котором переменные окружения выставляешь.
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Офлайн
Вот, набросал некошерный вариант. ;)
На моей машине (русский виндовс XP) работает. Переходит в нужный каталог с помощью команды cd и выполняет в нем dir.
#coding=utf-8
import subprocess
proc = subprocess.Popen('cmd.exe', stdin = subprocess.PIPE, stdout = subprocess.PIPE) #запускаем cmd
while 1:
output = proc.stdout.readline() #читаем строку - вывод
print output,
if " 1985-2001." in output: #ищем окончание привествия шелла
break
proc.stdin.write('cd c:\\windows\r\n') #даем команду
#далее читаем строки, которые выводятся при выполнении коменды cd
output = proc.stdout.readline() #читаем
print output,
output = proc.stdout.readline() #читаем вывод
print output,
output = proc.stdout.readline() #читаем вывод
print output,
#даем команду dir
proc.stdin.write('dir\r\n')
while 1:
output = proc.stdout.readline() #читаем вывод построчно
print output,
if u" байт свободно" in (output.decode('cp866')): #ищем окночание работы команды dir
break
Отредактировано (Окт. 1, 2008 18:58:45)
Офлайн
Спасибо большое, shiza . Но я уже сам дошёл. Но тут у меня появился другой вопрос, более сложный:
step1 = subprocess.Popen('cmd', shell = True,
stdout = subprocess.PIPE,
stdin = subprocess.PIPE)
step1.stdin.write('cd C:\Program Files\Program\n')
step1.stdin.write('setenv.bat\n')
step1.stdin.write('cd C:\Program Files\Program\Training\n')
step1.stdin.write('Create.py\n')
И теперь уже с этим Create.py мне нужно работать, то есть передавать команды и получать результаты. Как я понимаю, необходимо открывать ещё один субпроцесс. Но как правильно это будет сделать?
Отредактировано (Окт. 1, 2008 19:08:52)
Офлайн
Если ты откроешь еще один процесс, то потеряешь, все то что утановил в бат-файле
Офлайн