Найти - Пользователи
Полная версия: os.popen() и subprocess.Popen()
Начало » Python для экспертов » os.popen() и subprocess.Popen()
1
Enchantner
Собственно, столкнулся с такой проблемой - необходимо сгенерировать довольно длинной шелловой командой файл сертификата, на основе которого потом генерируется пакет, причем со вводом пароля из сертификата. Прикол в том, что если вгонять эту строку в 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')
Хотелось бы, естественно, побыстрее. В чем проблема?
poltergeist
proc = Popen(command, shell=True, stdout=PIPE)
proc.wait()
Enchantner
poltergeist
Спасибо, но от этого быстрее не стало, скорее наоборот. Те же команды, будучи набраны в консоли, выполняются каждая максимум по две секунды, тут же он ждет опять секунд 15. В чем прикол? Может, как-то с потоками намудрить?

АПД: Плюс еще одна проблема. Файл, генерируемый с помощью шелл-команды, получается битым, хотя при наборе той же команды в строке все работает на ура с теми же исходниками для сборки. Что за фигня?
ZAN
Попробовал смоделировать ситуацию, процесс корректно отрабатывает, если использовать 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)
Enchantner
ZAN
Да он нормально срабатывает и при proc.stdin.write(“abc”) :) Пакет генерируется без ошибок, только потом не хочет запускаться. Если кому интересно - пробую написать питоновый биндинг для создания Adobe AIR - приложений. Если хочется - могу код приложить.
ZAN
Я просто не очень понимаю, на каком этапе приложение тормозит?
1. Порождение субпроцесса
2. Выполнение самого приложения
3. Ожидание ввода
4. Дальнейшее выполнение
5. Ожидание завершения субпроцесса

Просто изначально мне показалось, что проблема с вводом/выводом. Если есть какая-то буфферизация, то вполне могло приводить к таким эффектам…
Да, код выложи на каком-нибудь сервисе, неплохо бы заtimeit-ить его =)
Enchantner
ZAN
Думает, похоже, именно на этой команде. Вот код (не ругайте за кривизну, лучше дайте советы, как улучшить):
http://pastebin.mozilla-russia.org/99375
Ferroman
“Улучшить” в смысле скорости?
Я бы, все-таки, рекомендовал использовать профайлер и найти именно “узкие” места. Над ними и работать.

PS:Использование global - плохо.
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