2016-06-30 9 views
0

私はこの問題に直面しており、解決策を見つけました。しかし、私はそれがなぜこのように振る舞うのか理解していません。pythonのコマンドライン引数は引用符で囲む必要がありますか?

実行するscript1.pyがあるとします。これには、コマンドラインからの2つの入力と、パスと、日付が必要です。/root/x/y *には、/ root/x/y1 /と/ root/x/y2 /の2つのフォルダがあります。そして、両方のフォルダの下に20160621のフォルダがあります。

スクリプトは次のようになります。

if __name__ == "__main__": 

    start_time = time.time() 
    print sys.argv[1], sys.argv[2] 
    main(expPath = sys.argv[1], expDate = sys.argv[2]) 

私は

python script1.py /root/x/y*/ 20160621 

してスクリプトを呼び出す場合、私は私場合は時々、私は

/root/x/y1/ /root/x/y2/ 

を取得しています、しかし

/root/x/y*/ 20160621 

のプリントアウトを取得するために期待両方の引数を引用してスクリプトを呼び出すと、期待しています。

python script1.py '/root/x/y*/' '20160621' 

このような違いについては、何らかの理由または説明がありますか?

答えて

1

これはPythonの問題ではありません。これはコマンドラインに関する問題です。

/root/x/y*/をコマンドラインで渡すと、文字通りその引数は渡されません。あなたは「グロビング」と呼ばれるものを使用しています。コマンドラインは自動的にそれを'/root/x/y1/' '/root/x/y2/'に展開してからスクリプトに渡します。それらを引用符で囲むと、リテラルテキストが渡され、コマンドラインでテキストがグロブされないので、期待どおりに動作します。

実際には、コマンドラインでglobbingを処理できるようにすることをお勧めします。多くのシェルは非常に高度なグロビング能力を備えており、エンドユーザーはこの機能を使用してファイル名をスクリプトに渡します。

関連する問題