Найти - Пользователи
Полная версия: Модуль subprocess
Начало » Python для экспертов » Модуль subprocess
1 2 3 4
orion
Люди, помогите пожалуйста. Очень нужно.
Запускаю процесс:

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
Да говорюже - кривой путь =)
аргументы
env для уставновки окружения
cwd - для рабочего каталога - рулят
Ferroman
Сделай батник и его запускай.
orion
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Ferroman
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Что значит “при чём батник”. Пишите батник где выполняете последовательно нужные команды и в нужной последовательности, и вызываете на питоне. Ловите stdout. Это - если заранее известна последовательность.
Если не знаете последовательности - рассказывайте какие комбинации работы с stdin\stdout у вас не получились.
shiza
Можно но гимроно.
Вот ты когда в консоли запускаешь команды по очереди.
Ты запускаешь команду. Ждешь ее выполнения (визуально - т.е. видишь что строчки бежать перестали), после этого даешь следующую. Тоже придется делать и в питоне. Парсить вывод команды и тогда давать следующую.
shiza
orion
Да при чём здесь батник. Говорю же, мне нужно написать это на Питоне. Неужели никто не знает, как это сделать?
Да тыж всеравно батник запускаешь, в котором переменные окружения выставляешь.
shiza
Вот, набросал некошерный вариант. ;)
На моей машине (русский виндовс 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
Спасибо большое, 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
Если ты откроешь еще один процесс, то потеряешь, все то что утановил в бат-файле
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB