Форум сайта python.su
Собственно, столкнулся с такой проблемой - необходимо сгенерировать довольно длинной шелловой командой файл сертификата, на основе которого потом генерируется пакет, причем со вводом пароля из сертификата. Прикол в том, что если вгонять эту строку в 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)
Офлайн
proc = Popen(command, shell=True, stdout=PIPE)
proc.wait()
Офлайн
poltergeist
Спасибо, но от этого быстрее не стало, скорее наоборот. Те же команды, будучи набраны в консоли, выполняются каждая максимум по две секунды, тут же он ждет опять секунд 15. В чем прикол? Может, как-то с потоками намудрить?
АПД: Плюс еще одна проблема. Файл, генерируемый с помощью шелл-команды, получается битым, хотя при наборе той же команды в строке все работает на ура с теми же исходниками для сборки. Что за фигня?
Отредактировано (Июнь 6, 2009 11:02:00)
Офлайн
Попробовал смоделировать ситуацию, процесс корректно отрабатывает, если использовать 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)
Офлайн
ZAN
Да он нормально срабатывает и при proc.stdin.write(“abc”) :) Пакет генерируется без ошибок, только потом не хочет запускаться. Если кому интересно - пробую написать питоновый биндинг для создания Adobe AIR - приложений. Если хочется - могу код приложить.
Отредактировано (Июнь 6, 2009 14:30:55)
Офлайн
Я просто не очень понимаю, на каком этапе приложение тормозит?
1. Порождение субпроцесса
2. Выполнение самого приложения
3. Ожидание ввода
4. Дальнейшее выполнение
5. Ожидание завершения субпроцесса
Просто изначально мне показалось, что проблема с вводом/выводом. Если есть какая-то буфферизация, то вполне могло приводить к таким эффектам…
Да, код выложи на каком-нибудь сервисе, неплохо бы заtimeit-ить его =)
Офлайн
ZAN
Думает, похоже, именно на этой команде. Вот код (не ругайте за кривизну, лучше дайте советы, как улучшить):
http://pastebin.mozilla-russia.org/99375
Офлайн
“Улучшить” в смысле скорости?
Я бы, все-таки, рекомендовал использовать профайлер и найти именно “узкие” места. Над ними и работать.
PS:Использование global - плохо.
Офлайн