2017-11-15 3 views
0

これはバグですか?sys.argvにコマンドラインで引用符を使用していないのはなぜですか?

python tmp.py find . -name '*.py' 

実際の出力:

['tmp.py', 'find', '.', '-name', '*.py'] 

予想される出力:呼び出され

#!/usr/bin/env python3.6 
# filename: tmp.py 
import sys 

print(sys.argv) 

['tmp.py', 'find', '.', '-name', "'*.py'"] 

は、実際の出力内の引用の欠如に注意してください。あなたのシェルのpythonに引数を渡す前に、引用符が削除されるため

+0

なぜあなたは文字通りの引用符を期待していますか? –

+0

私はなぜいけませんか?私はPythonに何かをさせるのではなく、実際にコマンドライン上にあるものを抽出するよう求めています。 –

+0

... 'subprocess.Popen(['foo'、 'hello'])'を呼び出すと、 'foo'がPythonの引用符を見るのを期待していませんリテラル引数 'hello'。同様に、純粋にシェルシンタックスであり、実行されるソフトウェアに渡されない引用符を他のプログラムが見ることは期待できません。 –

答えて

2

シェルは、実行中のコマンドをCの文字列のリストに分解します。 これらの文字列は、実行されているプログラムに渡されます。例では

python tmp.py find . -name '*.py' 

...のように正しく実装さシェルは(C構文で)になりますthe execve syscallargv要素に対して生成されます。引数リスト:

char[][]{ "python", "tmp.py", "find", ".", "-name", "*.py", NULL } 

Pythonを実行すると、元のコマンドが何であるかがわかりません:'*.py'または\*.pyなどを入力したかどうかを知る方法がありません事;シェルがオペレーティングシステムに渡した引数リストのみが表示されます。

4

なし、(そうでなければ拡大する*.pyワイルドカード)

はあなたが必要があると思いたいものを手に入れる:

python tmp.py find -name "'*.py'" 

この動作はシェルに依存することに注意してください。 Windowsでは、単一引用符が'*.py'を渡し、何も特別な意味を持っていないので、あなたが得るでしょう:

['tmp.py', 'find', '.', '-name', "'*.py'"] 

はまた、あなたが引用符を除去する必要があると思いますので、引用符で保護されたワイルドカードは、Pythonの側には実質金利を持っていないことに注意してくださいglob.glob

関連する問題