Argparseオプションの位置引数?


652

次のように使用するためのスクリプトがあります。 usage: installer.py dir [-h] [-v]

dir 次のように定義される位置引数です。

parser.add_argument('dir', default=os.getcwd())

私はdirをオプションにしたい:それが指定されていないときはそれだけにする必要がありますcwd

残念ながら、dir引数を指定しないとが表示されますError: Too few arguments

回答:


825

使用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

14
?*は、正規表現で意味するのと同じ意味ですか(つまり?、0または1が*必要で、0以上が必要です)。もしそうなら、同様に+動作しますか?
Dolan Antenucci、2013年

37
@dolan:はい、+動作します。詳細については、docs.python.org / 2 / library / argparse.html#nargsを参照してください。
Vinay Sajip 2013年

2
dirをオプションの引数に表示する方法はありますか?または、位置引数には先行する「オプション」修飾子が必要です。(ヘルプに関する限り)そのように登録することは可能ですか?
scagnetti 2014

6
@ant上記から、dirはオプションであることがわかります(argparseの出力で角かっこ内に表示されていることがこれを示しています)。
Vinay Sajip 2014

1
Tx!しようとしてoptions.dirいたのでargs.dir、ではなくからdirにアクセスしてください!
ptim 2018

69

@VinaySajip回答の拡張として。さらにnargs言及する価値があります

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N(整数)。コマンドラインからのN個の引数がリストにまとめられます

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

「*」。存在するすべてのコマンドライン引数はリストに集められます。それは一般的で複数の位置引数を持つようにあまり意味がないことnargs='*'が、と複数のオプションの引数がnargs='*'可能です。

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

「+」。'*'と同様に、存在するすべてのコマンドライン引数はリストに集められます。さらに、少なくとも1つのコマンドライン引数が存在しない場合は、エラーメッセージが生成されます。

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER。残りのすべてのコマンドライン引数はリストに集められます。これは通常、他のコマンドラインユーティリティにディスパッチするコマンドラインユーティリティに役立ちます。

場合はnargsキーワード引数が提供されていない、消費引数の数は、アクションによって決定されます。通常、これは単一のコマンドライン引数が消費され、単一のアイテム(リストではない)が生成されることを意味します。

編集(@Acumenusのコメントからコピー) nargs='?' ドキュメントには「?」と書かれています。可能であれば、1つの引数がコマンドラインから使用され、単一のアイテムとして生成されます。コマンドライン引数がない場合、デフォルトの値が生成されます。


3
ただしnargs='?'、リストが作成されないことに注意してください。
Acumenus 2016年

@ABB回答の最後の行Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.これが役に立てば
幸い

1
引用された行はnargsnargs='?'を定義していない場合を示していますが、定義しています。ドキュメントは言います:「?」。可能であれば、1つの引数がコマンドラインから使用され、単一のアイテムとして生成されます。コマンドライン引数がない場合、デフォルトの値が生成されます。
Acumenus 2016年

@ABB何かが足りないと感じたら答えを編集してください。ありがとう。
Matas Vaitkevicius 16年

違いは何であるnargs=argparse.REMAINDERnargs='*'(Pythonの2.7.10とPython 3.6.1でテスト)、それは私には思えるように、彼らは実際には同じですが?

-5

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()

11
OPは、 '-dir'ではなく、位置パラメーターについて尋ねていました。'required'は、位置情報には無効な引数です。そして「偽」はタイプミスでした、彼女は「偽」を意味しました。初心者の場合は+1、だらしない場合は-1。
SoloPilot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.