Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 5, 2009 22:14:32

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

os.popen() и subprocess.Popen()

Собственно, столкнулся с такой проблемой - необходимо сгенерировать довольно длинной шелловой командой файл сертификата, на основе которого потом генерируется пакет, причем со вводом пароля из сертификата. Прикол в том, что если вгонять эту строку в os.popen() - то все работает, но сама команда выполняется очень долго, секунд 15 в среднем. А если же юзать subprocess.Popen() - все выполняется быстро, но на этапе сборки пакета выдает ошибку либо “Файл ключа не найден”, либо “Неверный пароль”. Код выглядит так:

from subprocess import Popen, PIPE
os.chdir(self.fullpath)
command = "создаем сертификат"
proc = Popen(command, shell=True, stdout=PIPE)
...
os.chdir(self.fullpath)
command = "генерим пакет на основе сертификата"
proc2 = Popen(command, shell=True, stdin=PIPE, stdout=PIPE)
proc2.stdin.write(mypass+'\n')
Хотелось бы, естественно, побыстрее. В чем проблема?



Отредактировано (Июнь 5, 2009 22:17:27)

Офлайн

#2 Июнь 6, 2009 07:58:02

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

os.popen() и subprocess.Popen()

proc = Popen(command, shell=True, stdout=PIPE)
proc.wait()



Офлайн

#3 Июнь 6, 2009 10:09:22

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

os.popen() и subprocess.Popen()

poltergeist
Спасибо, но от этого быстрее не стало, скорее наоборот. Те же команды, будучи набраны в консоли, выполняются каждая максимум по две секунды, тут же он ждет опять секунд 15. В чем прикол? Может, как-то с потоками намудрить?

АПД: Плюс еще одна проблема. Файл, генерируемый с помощью шелл-команды, получается битым, хотя при наборе той же команды в строке все работает на ура с теми же исходниками для сборки. Что за фигня?



Отредактировано (Июнь 6, 2009 11:02:00)

Офлайн

#4 Июнь 6, 2009 13:32:37

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

os.popen() и subprocess.Popen()

Попробовал смоделировать ситуацию, процесс корректно отрабатывает, если использовать Popen.communicate():

#parent.py:
from subprocess import Popen, PIPE

cmd = 'python child.py'
proc2 = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)
print proc2.communicate('abc')


#child.py:
import time

time.sleep(2)
var = raw_input('input> ')
print 'You typed: "%s"' %var


#output:
('input> You typed: "abc"\n', None)



Отредактировано (Июнь 6, 2009 13:34:14)

Офлайн

#5 Июнь 6, 2009 14:29:00

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

os.popen() и subprocess.Popen()

ZAN
Да он нормально срабатывает и при proc.stdin.write(“abc”) :) Пакет генерируется без ошибок, только потом не хочет запускаться. Если кому интересно - пробую написать питоновый биндинг для создания Adobe AIR - приложений. Если хочется - могу код приложить.



Отредактировано (Июнь 6, 2009 14:30:55)

Офлайн

#6 Июнь 6, 2009 23:25:21

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

os.popen() и subprocess.Popen()

Я просто не очень понимаю, на каком этапе приложение тормозит?
1. Порождение субпроцесса
2. Выполнение самого приложения
3. Ожидание ввода
4. Дальнейшее выполнение
5. Ожидание завершения субпроцесса

Просто изначально мне показалось, что проблема с вводом/выводом. Если есть какая-то буфферизация, то вполне могло приводить к таким эффектам…
Да, код выложи на каком-нибудь сервисе, неплохо бы заtimeit-ить его =)



Офлайн

#7 Июнь 7, 2009 10:28:36

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

os.popen() и subprocess.Popen()

ZAN
Думает, похоже, именно на этой команде. Вот код (не ругайте за кривизну, лучше дайте советы, как улучшить):
http://pastebin.mozilla-russia.org/99375



Офлайн

#8 Июнь 9, 2009 14:54:15

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

os.popen() и subprocess.Popen()

“Улучшить” в смысле скорости?
Я бы, все-таки, рекомендовал использовать профайлер и найти именно “узкие” места. Над ними и работать.

PS:Использование global - плохо.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version