运行rpm2cpio时,Python子进程调用挂起

时间:2016-06-30 12:43:55

标签: python process rpm strace cpio

我使用python subprocess运行以下命令从rpm中提取文件。 但是当rpm大小超过25 - 30 MB时,命令会失效。尝试使用Popencallstdout作为PIPEos.system来尝试使用该命令。当我在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内容?

2 个答案:

答案 0 :(得分:0)

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

有关记录必要计算的rpm2cpio.sh shell脚本,请参阅How do I extract the contents of an rpm?。唯一的微妙之处在于确保签名和元数据头之间的填充(对齐所需)是正确的。

答案 1 :(得分:0)

您的输出管道已满。许多地方python docs注意来做你正在做的事情:

  

不要将stdout = PIPE或stderr = PIPE与此函数一起使用,因为它可能会基于子进程输出卷死锁。需要管道时,使用Popen和communic()方法。