次のように使用するためのスクリプトがあります。
usage: installer.py dir [-h] [-v]
dir
次のように定義される位置引数です。
parser.add_argument('dir', default=os.getcwd())
私はdir
をオプションにしたい:それが指定されていないときはそれだけにする必要がありますcwd
。
残念ながら、dir
引数を指定しないとが表示されますError: Too few arguments
。
次のように使用するためのスクリプトがあります。
usage: installer.py dir [-h] [-v]
dir
次のように定義される位置引数です。
parser.add_argument('dir', default=os.getcwd())
私はdir
をオプションにしたい:それが指定されていないときはそれだけにする必要がありますcwd
。
残念ながら、dir
引数を指定しないとが表示されますError: Too few arguments
。
回答:
使用nargs='?'
(またはnargs='*'
複数のディレクトリが必要な場合)
parser.add_argument('dir', nargs='?', default=os.getcwd())
拡張例:
>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]
positional arguments:
dir
optional arguments:
-h, --help show this help message and exit
-v
+
動作します。詳細については、docs.python.org / 2 / library / argparse.html#nargsを参照してください。
options.dir
いたのでargs.dir
、ではなくからdirにアクセスしてください!
@VinaySajip回答の拡張として。さらにnargs
言及する価値があります。
parser.add_argument('dir', nargs=1, default=os.getcwd())
N(整数)。コマンドラインからのN個の引数がリストにまとめられます
parser.add_argument('dir', nargs='*', default=os.getcwd())
「*」。存在するすべてのコマンドライン引数はリストに集められます。注それは一般的で複数の位置引数を持つようにあまり意味がないことnargs='*'
が、と複数のオプションの引数がnargs='*'
可能です。
parser.add_argument('dir', nargs='+', default=os.getcwd())
「+」。'*'と同様に、存在するすべてのコマンドライン引数はリストに集められます。さらに、少なくとも1つのコマンドライン引数が存在しない場合は、エラーメッセージが生成されます。
parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())
argparse.REMAINDER
。残りのすべてのコマンドライン引数はリストに集められます。これは通常、他のコマンドラインユーティリティにディスパッチするコマンドラインユーティリティに役立ちます。
場合はnargs
キーワード引数が提供されていない、消費引数の数は、アクションによって決定されます。通常、これは単一のコマンドライン引数が消費され、単一のアイテム(リストではない)が生成されることを意味します。
編集(@Acumenusのコメントからコピー) nargs='?'
ドキュメントには「?」と書かれています。可能であれば、1つの引数がコマンドラインから使用され、単一のアイテムとして生成されます。コマンドライン引数がない場合、デフォルトの値が生成されます。
nargs='?'
、リストが作成されないことに注意してください。
Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.
これが役に立てば
nargs
、nargs='?'
を定義していない場合を示していますが、定義しています。ドキュメントは言います:「?」。可能であれば、1つの引数がコマンドラインから使用され、単一のアイテムとして生成されます。コマンドライン引数がない場合、デフォルトの値が生成されます。
parser.add_argument
スイッチも必要です。使用できますrequired=False
。Python 2.7のサンプルスニペットを次に示します。
parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()
?
と*
は、正規表現で意味するのと同じ意味ですか(つまり?
、0または1が*
必要で、0以上が必要です)。もしそうなら、同様に+
動作しますか?