2016-06-30 28 views
0

我正在運行下面的命令,使用python子進程從rpm中提取文件。 但是,當rpm大小超過25-30 MB時,該命令將失敗。嘗試使用Popen,call,使用stdout作爲PIPEos.system。當我直接在shell中運行它時,此命令正常工作。問題是,只有當我通過某些手段從Python的Python子進程在運行時調用hungs rpm2cpio

調用此

命令:

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 

我有2個問題:

  1. 有人可以弄清楚這裏有什麼問題嗎?爲什麼當rpm大小超過25 MB時會失敗。
  2. 有沒有其他方法可以從python中提取rpm內容?
+0

請發表您使用的Python代碼。您是否將stdout重定向到PIPE,然後忘記按照以下答案之一的建議閱讀管道?如果代碼不需要調試,我們就無法進行調試。 – tdelaney

回答

0

如果你只想要的是* .rpm包的有效載荷,那麼做計算找到壓縮的cpio有效載荷的開始,並直接在python中執行操作。

請參閱How do I extract the contents of an rpm?以獲取記錄必要計算的rpm2cpio.sh shell腳本。唯一的微妙之處在於確保簽名和元數據標題之間的填充(對齊需要)是正確的。

0

您的輸出管道已滿。該python docs注意到在許多地方做你正在做的事情:

不要使用標準輸出=管或標準錯誤= PIPE這個功能,可以根據僵局子進程輸出捲上。當需要管道時,使用Popen和communications()方法。

相關問題