2016-07-28 1 views
0

コマンドでos.systemのパラメータの一部として:

make foo -f $* 

は、次のようにそれはPythonスクリプトから呼び出されたときに比べ、コマンドラインから呼び出された異なる機能を持っています

import os 
os.system(make foo -f $*) 

ここに記載されている通り:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF $ *は基本的には単一の単語として見られるすべての位置パラメータです。

Pythonは単純に "$ *"と解釈しているようです。とにかくこれを回避して同じ機能を複製するには?

私は.batスクリプトを書いて、それをPythonで呼び出すことができますが、私はもっと雄弁なことを望んでいました。

+0

'os.system'については忘れてしまいます。可能な限り 'shell = True'を渡す' subprocess'と* avoid *の関数を常に使用してください。 – Bakuriu

答えて

1

あなたが指摘したように、$ *はPythonでは特別な意味を持ちません。理解は、あなたが使っているどのシェルでも完全に行われます。あなたには、いくつかのコマンドにスクリプトに渡されたすべての位置パラメータを渡したい場合は、次の

import os, sys 
os.system("make foo -f {}".format(" ".join(sys.argv[1:]))) 

を試すことができますos.systemが廃止されていることが注意してください。おそらく

import subprocess, sys 
subprocess.check_call("make foo -f {}".format(" ".join(sys.argv[1:])), shell=True) 

を代わりに使用する必要があります。

編集

コメントで示唆したように、コマンドが「信頼できない」入力から構築されるたびに、1は、このようなプログラムのコマンドラインとして、shell=Trueを使用しないでください。したがって、はるかに良い代替手段が使用されます。

import subprocess, sys 
subprocess.check_call(['make', 'foo', '-f'] + sys.argv[1:]) 
+2

そのために 'shell = True'を使う理由はないことに注意してください。 check_call(['make'、 'foo'、 '-f'] + sys.argv [1:])を使うだけで簡単に '' join'を呼び出すこともできます。 – Bakuriu

+0

@Bakuriu良い点:) –

+0

@Bakuriuは私にそれを打ち負かしました - ここでは例を挙げてシェルを使用する理由はありません - 潜在的に "面白い"コマンドを避けるために可能な限り回避してください –

関連する問題