Argparse необязательные позиционные аргументы?

У меня есть script, который должен использоваться следующим образом: usage: installer.py dir [-h] [-v]

dir - это позиционный аргумент, который определяется следующим образом:

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

Я хочу, чтобы dir был необязательным: если он не указан, он должен быть cwd.

К сожалению, когда я не указываю аргумент dir, я получаю Error: Too few arguments.

Ответ 1

Используйте 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

Ответ 2

В качестве дополнения к ответу @VinaySajip. Есть и nargs заслуживающие упоминания 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. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER. Все остальные аргументы командной строки собраны в список. Это обычно полезно для утилит командной строки, которые отправляют другим утилитам командной строки

Если nargs ключевого слова nargs, количество используемых аргументов определяется действием. Обычно это означает, что будет использован один аргумент командной строки и будет создан один элемент (не список).

Редактировать (скопировано из комментария @Acumenus) nargs='?' Документы говорят: "?". Один аргумент будет использован из командной строки, если это возможно, и будет создан как один элемент. Если аргумент командной строки отсутствует, будет создано значение по умолчанию.

Ответ 3

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