2011-06-22 11 views
3

私はPython 3で(多少)モジュラーアプリケーションを作成していますが、実行時に指定されたプログラムでPythonスクリプトではない任意のプログラムを実行したいと思います。shebangを使用してsubprocess.callでpythonスクリプトを実行

だから私は、例えば使用、

subprocess.call([spam, "-i", eggs, "-o", ham]) 

spampython3にシェバングと実行権限で、Pythonスクリプトであるなら、私

subprocess.call(["python3", spam, "-i", eggs, "-o", ham]) 

場合、私は

OSError: [Errno 8] Exec format error 

を取得それはうまく動作します。

あなたはその理由を知っていますか? python3を指定せずにspamを実行するにはどうすればよいですか?

+0

pythonスクリプトファイルは実行可能ですか? – jterrace

+0

はい、実行可能です。 – Evpok

答えて

8

試してみてください、あなたはあなたの配列を必要とするこのように、コマンド文字列に変換されるために:

subprocess.call(' '.join([spam, "-i", eggs, "-o", ham]), shell=True) 

これは、直接の代わりにシェルを起動しますコマンドを実行するとシェルはシバンを処理できるようになります。

+0

ニース、それは動作します:)あなたはなぜ 'コール'がシバンを気にしないのか知っていますか? – Evpok

+1

整流: 'spam 'に引数を渡す' subprocess.call( "" .join([spam、 "-i"、eggs、 "-o"、ham])、shell = True)を書く必要がある '引数はスクリプトではなくシェルに渡されます。 http://docs.python.org/dev/py3k/library/subprocess.html#using-the-subprocess-module – Evpok

+0

@Evpok:優れた呼び出しを参照してください。気付かなかったこともあります。私はそれを更新します。 –

-1

あなたはshell=Trueを使用する必要が

subprocess.call(['spam.py', "-i", eggs, "-o", ham]) 
+0

'' spam''ではなく '' spam''です。文字列ではなく変数です。あなたが提案するスクリプトを直接参照することもできません。 – Evpok

+0

この投稿は役に立ちましたが、元の質問には答えません。答えは上記の 'shell = True'を使うことです。 – Klik

関連する問題