0

我正在使用 python 子进程运行以下命令以从 rpm 中提取文件。但是当 rpm 大小超过 25 - 30 MB 时,该命令会失败。尝试使用Popen, call, 和stdoutasPIPEos.systemas 的命令。当我直接在 shell 中运行此命令时,它运行良好。问题只是当我通过某种方式从 Python 调用它时

命令:

rpm2cpio <rpm_name>.rpm| cpio -idmv

我对进程 ID 进行了 strace,发现它总是挂在一些写系统调用上

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

我有两个问题:

  1. 有人能弄清楚这里有什么问题吗?为什么当 rpm 大小超过 25 MB 时它会失败。
  2. 有没有其他方法可以从 python 中提取 rpm 内容?
4

2 回答 2

1

您的输出管道已满。python 文档在许多地方都指出不要做你正在做的事情:

请勿将此函数与 stdout=PIPE 或 stderr=PIPE 一起使用,因为这可能会基于子进程输出量而死锁。当您需要管道时,将 Popen 与communicate() 方法一起使用。

于 2016-07-23T14:59:02.507 回答
0

如果您想要的只是 *.rpm 包的有效负载,则进行计算以找到压缩的 cpio 有效负载的开头并直接在 python 中执行操作。

请参阅如何提取 rpm 的内容?用于记录必要计算的 rpm2cpio.sh shell 脚本。唯一的微妙之处是确保签名和元数据头之间的填充(对齐所需)是正确的。

于 2016-07-01T09:17:30.850 回答