Форум сайта python.su
0
Люди, помогите пожалуйста. Очень нужно.
Запускаю процесс:
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 на что-либо другое - не суть важно. Мне нужно само выполнение комманд в одном процессе.
Офлайн
0
Да говорюже - кривой путь =)
аргументы
env для уставновки окружения
cwd - для рабочего каталога - рулят
Отредактировано (Окт. 1, 2008 18:23:40)
Офлайн
1
Сделай батник и его запускай.
Офлайн
0
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Офлайн
1
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?Что значит “при чём батник”. Пишите батник где выполняете последовательно нужные команды и в нужной последовательности, и вызываете на питоне. Ловите stdout. Это - если заранее известна последовательность.
Офлайн
0
Можно но гимроно.
Вот ты когда в консоли запускаешь команды по очереди.
Ты запускаешь команду. Ждешь ее выполнения (визуально - т.е. видишь что строчки бежать перестали), после этого даешь следующую. Тоже придется делать и в питоне. Парсить вывод команды и тогда давать следующую.
Офлайн
0
orionДа тыж всеравно батник запускаешь, в котором переменные окружения выставляешь.
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Офлайн
0
Вот, набросал некошерный вариант. ;)
На моей машине (русский виндовс 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)
Офлайн
0
Спасибо большое, 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)
Офлайн
0
Если ты откроешь еще один процесс, то потеряешь, все то что утановил в бат-файле
Офлайн