2016-11-05 3 views
0

Python 2.7を使用してWindows上で正常に動作するプログラムのMac版をやろうとしています。 Mac(VirtualBoxで動作するOS X El Capitan)では、シェルに渡す引数が正しく認識されないため、失敗します。MacでのPython 2のサブプロセス引数のエラー

オリジナルコード:

for item in source_files: 

    # core process 
    output = sub.Popen(["mhl", "verify", "-vv", "-f", item, ">", text_report], 
         shell=True, 
         stdout=sub.PIPE, 
         stderr=sub.PIPE) 
    stdout_value, stderr_value = output.communicate() 

の下でマックのみ 'MHL' 引数が認識されているので、私はこの試みた:コマンドの機能今

sub.Popen(['mhl verify -vv -f', item, '>', text_report] 

をしかしアイテム(.mhlファイル)があります

sub.Popen(['mhl verify -vv -f', '/Users/simon/Documents/Documents.mhl', '>', text_report] 

と、この:

認識されていないので、私はこれを試してみました3210
sub.Popen(['mhl verify -vv -f', r'/Users/simon/Documents/Documents.mhl', '>', text_report] 

同じ結果が表示され、mhlファイルは '-f'引数の後に指定する必要があります。最初の引数に項目を直接追加すると、正常に機能します。

sub.Popen(['mhl verify -vv -f /Users/simon/Documents/Documents.mhl', '>', text_report] 

ここでは何が欠けていますか?

答えて

1

実行可能ファイル'mhl verify -vv -f'を実行するようにOSに依頼していますが、実行可能ファイルはありません。そこでは殻の分裂は起こらない。 shell=True

あなたは1つの文字列、として独立していない引数として、すべてに渡したいと思います。ここではパイプにstdoutを向けるにはほとんどのポイントは、すべてのstdout出力するので、そこにあることを

sub.Popen('mhl verify -vv -f {} > {}'.format(item, text_report), 
      shell=True, stdout=sub.PIPE, stderr=sub.PIPE) 

注意mhlのコマンドがファイルにリダイレクトされています。

mhlコマンドの出力をPythonで直接取得したい場合は、ここでシェル中間体を使用しません。 shell=Trueなしで実行してからちょうど出力を取得するためにsubprocess.check_output()を使用します。今、プログラム名と引数を別の文字列に準備分割に渡さなければならない

output = sub.check_output(['mhl', 'verify', '-vv', '-f', item]) 

注意。

+0

元のコードでは 'mhl'引数だけが認識されているように、あなたの答えはありがたいですが、うまくいきません。実際に 'mhl verify -vv -f'は' verify -vv -f '引数を指定したmhl実行ファイルの呼び出しとして正しく認識されますが、 '-f'引数の後ろにmhlファイルがあるはずです。 –

+0

@SimonTheChain: 'item'、'> '、' text_report'も渡します。 –

+0

@SimonTheChain:updated;私はあなたが 'shell = True'を設定したことを忘れていました。ここでは 'mhl verify -vv -f item'コマンドが実行されています。 –

関連する問題