2017-07-12 5 views
1

私はそれから引数を抽出するためにargparseモジュールを使用しようとしているが、素朴な実装はPythonインタプリタと呼ばれる障害が発生した場合:Pythonのargparse

1 import argparse 
    2 import sys 
    3 
    4 parser = argparse.ArgumentParser(description="some test program") 
    5 parser.add_argument('--some-option', action="store", dest="some_option") 
    6 
    7 parsed_args = parser.parse_args(sys.argv) 
    8 print(vars(parsed_args) 

それが検出されるため失敗スクリプトの名前として最初の引数 - この場合は「test.py」:

~$: python3 ./test.py --some-option=5 
usage: test.py [-h] [--some-option INPUT] 
test.py: error: unrecognized arguments: ./test.py 

私は、現時点では発見したソリューションはarugmentsからPythonスクリプト名を検索し、削除することですが、これはそうです不愉快なハックのように、最初の議論が正当なものであれば問題を抱えていますこれは一部ですので、私はintepreterへの呼び出しを取り除くことはできません。

1 import argparse 
    2 import sys 
    3 
    4 parser = argparse.ArgumentParser(description="some test program") 
    5 parser.add_argument('--some-option', action="store", dest="some_option") 
    6 
    7 print(sys.argv) 
    8 if sys.argv[0].find('.py') != -1: 
    9  args = sys.argv[1:] 
10 else: 
11  args = sys.argv 
12 
13 parsed_args = parser.parse_args(args) 
14 print(vars(parsed_args) 

argparse

注意を使用するときに厄介なPythonのファイル名を取り除くために良い方法はあります:imatelyはPythonのファイルでありますクロスプラットフォームのビルドシステムでは、python3またはpython3.exeに応じてpython実行ファイルをOSに応じて設定するmakefileがあります。

答えて

1

sys.argv[0]は、常にファイルの名前です。したがって、parsed_args = parser.parse_args(sys.argv[1:])を実行すると、ファイル名は常に無視されます。 python documentationパー

:Pythonスクリプトに渡されたコマンドライン引数のリストsys.argvの

。 argv [0]はスクリプト名です(これはオペレーティングシステムに依存し、 がフルパス名かどうかに依存します)。インタプリタへのコマンドラインオプション を使用してコマンドが実行された場合、argv [0]は文字列 '-c'に設定されます。スクリプト名がPythonインタプリタに渡されなかった場合、 argv [0]は空文字列です。

+0

あなたは正しいです。私はあなたがスクリプトを直接呼び出すと、sys.argvの引数としてpythonスクリプトを持っていないと思っていましたが、もちろんPythonデザイナーはスマートな人です..... – sdfgeoff

関連する問題