0

プロセスを呼び出し、そのstddとstoutの両方を文字列に出力して検査したいと思います。このコードは、予期しないエラーブロックをトリガーします。

try:
    proc = subprocess.Popen('ls -ddd 1>&2', stdout=subprocess.PIPE,  stderr=subprocess.PIPE,)
    stdout,stderr = proc.communicate()
    if len(stderr)>1:
        actualResult =stderr
    else:
        actualResult =stdout
    print actualResult
except:
    print "Unexpected error"

私はそれをhttp://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.htmlに基づいていますが、明らかに何かが欠けています。tryブロック内でこれを行うことは可能ですか?

4

1 に答える 1

3

ジェネリックExcept句を使用しないでください。例外がキャッチされ、スクリプトを修正できなくなります(すべての例外がキャッチされるので、どの例外が発生したかをどのように知ることができますか?)。

ここで、Exceptブロックを削除すると、に直面しますOSError: [Errno 2] No such file or directory。これはsubprocess.Popen、パス上で要求した実行可能ファイルが見つからないことを意味します。

shell = trueこれは、電話に出なかったために発生していますPopen
渡されないということは、という名前の実行可能ファイルを探しているshell = Trueことを意味します。これは、プロンプトで文字通り書き込む のと同じであり、「コマンドが見つかりません!」という結果になります。 (ファイル名にスペースとアンパサンドが含まれる実行可能ファイルがある場合を除きます!)subprocess.Popen"ls -ddd 1>&2""ls -ddd 1>&2"

もちろん、これはあなたが望むものではありませんls。あなたが望むのは、引数-dddとリダイレクトを使用してコマンドを呼び出すことです1>&2


簡単に言えば、shell = Trueあなたの呼び出しに追加します。

于 2012-11-13T22:17:56.397 に答える