orion
Окт. 1, 2008 17:14:50
Люди, помогите пожалуйста. Очень нужно.
Запускаю процесс:
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 на что-либо другое - не суть важно. Мне нужно само выполнение комманд в одном процессе.
shiza
Окт. 1, 2008 18:18:48
Да говорюже - кривой путь =)
аргументы
env для уставновки окружения
cwd - для рабочего каталога - рулят
Ferroman
Окт. 1, 2008 18:21:08
Сделай батник и его запускай.
orion
Окт. 1, 2008 18:24:00
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Ferroman
Окт. 1, 2008 18:28:36
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Что значит “при чём батник”. Пишите батник где выполняете последовательно нужные команды и в нужной последовательности, и вызываете на питоне. Ловите stdout. Это - если заранее известна последовательность.
Если не знаете последовательности - рассказывайте какие комбинации работы с stdin\stdout у вас не получились.
shiza
Окт. 1, 2008 18:34:06
Можно но гимроно.
Вот ты когда в консоли запускаешь команды по очереди.
Ты запускаешь команду. Ждешь ее выполнения (визуально - т.е. видишь что строчки бежать перестали), после этого даешь следующую. Тоже придется делать и в питоне. Парсить вывод команды и тогда давать следующую.
shiza
Окт. 1, 2008 18:39:08
orion
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Да тыж всеравно батник запускаешь, в котором переменные окружения выставляешь.
shiza
Окт. 1, 2008 18:53:29
Вот, набросал некошерный вариант. ;)
На моей машине (русский виндовс 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
По хорошему надо еще читать и парсить stderr, чтоб отлавливать ошибки.
orion
Окт. 1, 2008 19:07:35
Спасибо большое, 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 мне нужно работать, то есть передавать команды и получать результаты. Как я понимаю, необходимо открывать ещё один субпроцесс. Но как правильно это будет сделать?
shiza
Окт. 1, 2008 20:21:31
Если ты откроешь еще один процесс, то потеряешь, все то что утановил в бат-файле