2016-06-30 9 views
0

私はrpmからファイルを抽出するためにpythonサブプロセスを使って以下のコマンドを実行しています。 しかし、rpmサイズが25〜30 MBを超えるとコマンドが失敗します。 PopencallstdoutPIPEos.systemとしてコマンドを試してみました。このコマンドは、シェルで直接実行するとうまく動作します。問題は、私はPythonのrpm2cpioを実行しているときにPythonのサブプロセス呼び出しがハングアップする

から何らかの手段でこれを起動するときだけである

コマンド:

rpm2cpio <rpm_name>.rpm| cpio -idmv 

私は、プロセスIDにstraceのを行なったし、そのは、常にいくつかの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 MBを超えると、なぜ失敗するのですか?
  2. 私はPythonからrpmの内容を抽出することができます他の方法はありますか?
+0

ご使用のPythonコードを投稿してください。あなたはstdoutをPIPEにリダイレクトしましたか?そして、以下の答えの1つが示唆しているようにパイプを読むのを忘れましたか?デバッグする必要のないコードをデバッグすることはできません。 – tdelaney

答えて

0

* .rpmパッケージのペイロードが必要な場合は、計算して圧縮されたcpioペイロードの先頭を見つけ、Pythonで直接操作します。

必要な計算を記録するrpm2cpio.shシェルスクリプトについては、How do I extract the contents of an rpm?を参照してください。唯一の微妙な点は、署名ヘッダーとメタデータヘッダーの間のパディング(配置に必要)が正しいことを確認することです。

0

出力パイプがいっぱいです。それは子プロセスの出力ボリュームに基づいてデッドロックすることができ、この機能を標準出力= PIPEまたはstderr = PIPEを使用しないでください

を:あなたは何をしているかを行うには、多くの場所ないpython docsノート。 pipeが必要なときはPopenを使って、()メソッドを呼び出してください。

関連する問題