Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 1, 2008 17:14:50

orion
От:
Зарегистрирован: 2008-10-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Люди, помогите пожалуйста. Очень нужно.
Запускаю процесс:

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 на что-либо другое - не суть важно. Мне нужно само выполнение комманд в одном процессе.



Офлайн

#2 Окт. 1, 2008 18:18:48

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Да говорюже - кривой путь =)
аргументы
env для уставновки окружения
cwd - для рабочего каталога - рулят



Отредактировано (Окт. 1, 2008 18:23:40)

Офлайн

#3 Окт. 1, 2008 18:21:08

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Модуль subprocess

Сделай батник и его запускай.

Офлайн

#4 Окт. 1, 2008 18:24:00

orion
От:
Зарегистрирован: 2008-10-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?



Офлайн

#5 Окт. 1, 2008 18:28:36

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Модуль subprocess

Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Что значит “при чём батник”. Пишите батник где выполняете последовательно нужные команды и в нужной последовательности, и вызываете на питоне. Ловите stdout. Это - если заранее известна последовательность.
Если не знаете последовательности - рассказывайте какие комбинации работы с stdin\stdout у вас не получились.

Офлайн

#6 Окт. 1, 2008 18:34:06

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Можно но гимроно.
Вот ты когда в консоли запускаешь команды по очереди.
Ты запускаешь команду. Ждешь ее выполнения (визуально - т.е. видишь что строчки бежать перестали), после этого даешь следующую. Тоже придется делать и в питоне. Парсить вывод команды и тогда давать следующую.



Офлайн

#7 Окт. 1, 2008 18:39:08

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

orion
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Да тыж всеравно батник запускаешь, в котором переменные окружения выставляешь.



Офлайн

#8 Окт. 1, 2008 18:53:29

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Вот, набросал некошерный вариант. ;)
На моей машине (русский виндовс 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, чтоб отлавливать ошибки.



Отредактировано (Окт. 1, 2008 18:58:45)

Офлайн

#9 Окт. 1, 2008 19:07:35

orion
От:
Зарегистрирован: 2008-10-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Спасибо большое, 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)

Офлайн

#10 Окт. 1, 2008 20:21:31

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Если ты откроешь еще один процесс, то потеряешь, все то что утановил в бат-файле



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version