Вызов подпроцесса Python при запуске rpm2cpio
Я запускаю команду ниже, используя подпроцесс python для извлечения файлов из rpm. Но команда завершается ошибкой, когда размер об / мин превышает 25 - 30 МБ. Попробовал команду используя Popen
, call
, с stdout
как PIPE
а также os.system
также. Эта команда работает нормально, когда я запускаю ее в оболочке напрямую. Проблема только тогда, когда я вызываю это каким-то образом из Python
Команда:
rpm2cpio <rpm_name>.rpm| cpio -idmv
Я сделал стрейс для идентификатора процесса и обнаружил, что он всегда зависает от какого-то системного вызова write
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 вопроса:
- Может кто-нибудь разобраться в чем тут проблема? Почему происходит сбой, если размер rpm превышает 25 МБ.
- Есть ли другой способ извлечь содержимое rpm из python?
2 ответа
Ваш выходной канал заполнен. Документы Python отмечают, что во многих местах не делать то, что вы делаете:
Не используйте stdout=PIPE или stderr=PIPE с этой функцией, поскольку это может привести к взаимоблокировке на основе выходного тома дочернего процесса. Используйте Popen с методом connect (), когда вам нужны каналы.
Если вам нужна только полезная нагрузка пакета *.rpm, выполните вычисления, чтобы найти начало сжатой полезной нагрузки cpio и выполните операции непосредственно в python.
См. Как извлечь содержимое оборотов в минуту? для сценария оболочки rpm2cpio.sh, который документирует необходимые вычисления. Единственная тонкость заключается в том, чтобы гарантировать правильность заполнения (необходимого для выравнивания) между заголовками подписи и метаданных.