2016-06-30 4 views
0

Я запускаю следующую команду, используя подпроцесс python для извлечения файлов из rpm. Но команда не работает, когда размер оборотов превышает 25-30 МБ. Пробовал команду, используя Popen, call, с stdout как PIPE и os.system. Эта команда работает нормально, когда я запускаю ее непосредственно в оболочке. Проблема только тогда, когда я ссылаться на это с помощью некоторых средств из PythonПодпроцесс подпроцесса Python зависает при запуске rpm2cpio

Команда:

rpm2cpio <rpm_name>.rpm| cpio -idmv 

Я сделал Трассирование на идентификатор процесса и обнаружил, что его всегда висел на некоторой системе записи вызова

ps -ef | grep cpio 
root  4699 4698 4 11:05 pts/0 00:00:00 rpm2cpio kernel-2.6.32-573.26.1.el6.x86_64.rpm 
root  4700 4698 0 11:05 pts/0 00:00:00 cpio -idmv 

strace -p 4699 
Process 4699 attached 
write(10, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0rc_pixelview_new"..., 8192 

strace -p 4700 
Process 4700 attached 
write(2, "./lib/modules/2.6.32-573.26.1.el"..., 94 

у меня 2 вопроса:

  1. Может кто-то выяснить, что здесь проблема? Почему это происходит, когда размер оборотов превышает 25 МБ.
  2. Есть ли какой-либо другой способ я могу извлечь содержимое rpm из python?
+0

Пожалуйста, разместите код python, который вы использовали. Вы перенаправили stdout на PIPE, а затем забыли прочитать трубу, как предлагает один из нижеперечисленных ответов? Мы не можем отлаживать это, не требуя отладки кода. – tdelaney

ответ

0

Если вы хотите получить полезную нагрузку пакета * .rpm, тогда выполните вычисления, чтобы найти начало сжатой полезной нагрузки cpio и выполнить операции непосредственно в python.

См. How do I extract the contents of an rpm? для сценария оболочки rpm2cpio.sh, который документирует необходимые вычисления. Единственная тонкость заключается в том, что исправление (необходимое для выравнивания) между заголовками подписи и метаданных является правильным.

0

Ваша выходная труба заполнена. python docs нота во многих местах не делать то, что вы делаете:

Не используйте стандартный вывод = PIPE или Stderr = PIPE с этой функцией, как может тупиковой ситуации на основе объема производства дочернего процесса. Используйте Popen с методом communication(), когда вам нужны трубы.