Вызов подпроцесса 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 вопроса:

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

2 ответа

Ваш выходной канал заполнен. Документы Python отмечают, что во многих местах не делать то, что вы делаете:

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

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

См. Как извлечь содержимое оборотов в минуту? для сценария оболочки rpm2cpio.sh, который документирует необходимые вычисления. Единственная тонкость заключается в том, чтобы гарантировать правильность заполнения (необходимого для выравнивания) между заголовками подписи и метаданных.

Другие вопросы по тегам