2016-12-02 5 views
0

引数の前に余分なスペースが追加されています。などのインタラクティブシェルにおける例Python argparseは、引数の前に余分なスペースを追加します。

def parse_arguments(): 
    parser = argparse.ArgumentParser(
    prog='sample', 
    description='bla bla', 
    parser.add_argument('-s', '--search', dest='pattern', required=True, 
    help='search path pattern (e.g. /dir1/dir2/*.ext)') 

    args = parser.parse_args() 

    if args.pattern[0] == ' ': 
     print "One space is added to the argument" 
    return args 

以下のコードとテストに基づいて:sys.argv = ['', '-s=/Users/user/Desktop/test']として引数を提供

import sys 
sys.argv = ['', '-s /Users/user/Desktop/test'] 
execfile('test.py') 

https://stackoverflow.com/a/36376287/2101864から鼓舞)そのような付加を生じません。

これは文書化された動作ですか、何か迷っていますか?通常のユーザーは、引数タグと値の間にスペースを追加することが一般的なためです。

+0

詳細については、@aneroidありがとうございます。 –

答えて

2

test.pyを直接実行すると、余分なスペースは発生しません。それはtest.pyを実行する前にsys.argvを設定しているために、対話シェルで発生します。

sys.argv = ['', '-s /Users/user/Desktop/test'] 

しかし、端末からスクリプトを実行してsys.argvをチェックするとき、あなたが得る:

['test.py', '-s', '/Users/user/Desktop/test'] 

をまた-sと、端末から実行されている値との間に複数のスペースを無視します。

シェル/ターミナルは既に各パラメータをスクリプトに個別に提供しています(そして、Pythonはそれらをリストに入れます)。したがって、2番目のパラメータは-sで、-s /Users/user/Desktop/testではありません。 対話シェルでsys.argv = ['', '-s', '/Users/user/Desktop/test']を実行すると正しい結果が得られます。はないでしょうをargparse何

sys.argvに各引数をスキャンし、すべての引数名のパターンを探し、-s--searchです。一度見つけられると、それ以降のすべてが引数の値になります。 は-s=/Users/user/Desktop/testで標準arg=valueの表記であり、それは引数とその値の間の区切り文字として解釈されます。

関連する問題