2017-11-01 7 views
1

だから私は、Pythonに取得していますし、私は、スクリプトを書いている:Python - この出力が表示されるのはなぜですか?

  1. urllib.urlretrieveを使用してRPMをダウンロードしてください。
  2. rpm2cpioとcpioを使用してファイルを抽出します。
  3. ファイルにいくつかのことをしてください。
  4. shutil.rmtreeを使用してクリーンアップします。

機能的には、それはそれはそれのすべてをするのか、すべての良いことだが、私はクリーンアップコードに置くので、私は次の出力取得しています:

#!/usr/bin/python 

from contextlib import contextmanager 
import os, subprocess, shutil 

@contextmanager 
def cd(directory): 
    startingDirectory = os.getcwd() 
    os.chdir(os.path.expanduser(directory)) 
    try: 
     yield 
    finally: 
     os.chdir(startingDirectory) 

# Extract the files from the RPM to the temp directory 
with cd("/tempdir"): 
    rpm2cpio = subprocess.Popen(["rpm2cpio", "MyRPM.rpm"], stdout=subprocess.PIPE) 
    cpio = subprocess.Popen(["cpio", "-idm", "--quiet"], stdin=rpm2cpio.stdout, stdout=None) 

# Do 
# Some 
# Things 
# Involving 
# Shenanigans 

# Remove the temp directory and all it's contents 
shutil.rmtree("/tempdir") 
:ここ

rpm2cpio: MyRPM.rpm: No such file or directory 
cpio: premature end of archive 

コードです

ここでコードの構文上の問題(またはインポートや抜けなど)が表示された場合は、2つのメッセージが表示されている理由に実際に関係しない限り、無視してください。私は関連するビットへのスクリプトを削除しようとしました。私が探しているのは、なぜ上記の2つのメッセージが印刷されているのかという説明です。 私はスクリプトがトップダウンから実行されると仮定していましたが、今は私がこのケースで間違っていると思っていますか?

編集:スクリプトが明示的に閉じる必要があるように実行されている限り、 'rpm2cpio'と 'cpio'コマンドは何かを開いたままにしているように感じます...?それは意味をなさないでしょうか? :)

ありがとう! J

+0

1)ルートからのフォルダへの絶対パスですか?通常、一時的なディレクトリとファイルを作成するために、 '/ tmp'の_inside_を作成します。 2)この一時ディレクトリを作成しましたか?少なくともあなたが示したものは、それが存在しないことを示唆しています。 3)一時ディレクトリに 'MyRPM.rpm'を置いたことはありません。これらのうちの1つまたはすべてが、あなたのRPMを見つけることができない 'rpm2cpio'を説明するかもしれません。 – hunteke

+0

@hunteke 1)絶対パスです。はい、現在、スクリプトの横にディレクトリを作成してRPMを配置しています。私は/ tmpに最終的にアドバイスをしていただきありがとうございます2)私は機能的にすべてがうまくいっていると言いましたので、私はtempディレクトリを作成していて、RPMファイルをうまく抽出しています3)2と同じで、ありがとう – Jaymoney

+1

スクリプトは正しく'rpm2cpio'と' cpio'は作業を終了しますか?スクリプトが作業を行う前に一時ディレクトリを削除した場合、それらのメッセージを処理します。 – hunteke

答えて

0

subprocess.Popen is non-blocking、あなたは基本的には競合状態を持っているので、 - あなたの呼び出しの間Popenrmtreeにそれらのプロセスを終えることができるという保証はありませんrmtree実行する前に(あるいは開始が!)。

私はpopenのオブジェクトがブロックsubprocess.callあなたはコマンドをパイプしているどのようにあなたのためのオプションのようには見えません使用

cpio.wait() 
rpm2cpio.wait() 

# Remove the temp directory and all it's contents 
shutil.rmtree("/tempdir") 

に戻るのを待って、あなたが示唆しています。

+0

あなたの時間と情報のために素晴らしいことをありがとう。また、タイミングの問題であるとの結論に至るのを手伝った@huntekeにも感謝しています。 – Jaymoney

+1

さらに詳しい情報については、それ自身のcpio.wait()のように見えます。 – Jaymoney

関連する問題