我使用python subprocess运行以下命令从rpm中提取文件。
但是当rpm大小超过25 - 30 MB时,命令会失效。尝试使用Popen
,call
,stdout
作为PIPE
和os.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
我有两个问题:
答案 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()方法。