2012-05-07 20 views
2

私はPythonのサブプロセスモジュールを使って別のプログラムを起動しています。プログラムには引数 '-c {0-7}'が必要です。 C++プログラムでPythonのサブプロセスPopenがシェルにすべての引数を送信しない

this_dir = os.path.dirname(os.path.abspath(__file__)) 
cmd = [os.path.join(this_dir,'foobar'),'-c%d' % channel] 
print "Starting process: %s" % str(cmd) 
Proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True) 

、私は、渡された引数をチェックしている:私はPythonスクリプトを実行したときにここで

for (int i = 0; i < argc; i++) 
{ 
    cerr << i << " " << argv[i] << endl; 
} 
cerr << "" << endl; 

が出力されます。

[email protected]:~/embedded_pqa/saleae$ ./foobar.py -c3 
Starting process: ['/home/user/code/foobar', '-c3'] 
0 /home/user/code/foobar 

明らかなように、引数 '-c3'はサブプロセスに渡されていません。何かご意見は?

+0

'strace'や' truss'のようなツールは 'execve'システムコールに実際に渡されているかどうかを確認するのに適しています。また、 'shell = True'は悪です。引数の受け渡し方法を制御したい場合は、使用しないでください。 –

答えて

10

問題はshell=Trueです。 the docs引用:Unixでは

、シェル= Trueの場合:[...]引数がシーケンスである場合は、最初の項目は、コマンド文字列を指定し、任意の追加項目は、シェル自体への追加の引数として扱われます。

sh -c /home/user/code/foobar -c3 

シェルコマンド/home/user/code/foobarと追加のシェルパラメータ-c3として解釈:これは、次のコマンドを呼び出す手段

。とにかくどんなSHの機能を使用していない、あなたはすでに区切りの引数リストを自分で使用しているので、

はちょうどshell=Trueを取り除きます。

+0

助けてくれてありがとう。 'shell = True'が原因でした。 – Rusty

関連する問題