Как сделать использование печати argparse, если код не указан

Со следующим кодом:

import argparse
parser = argparse.ArgumentParser(description="Prepare something code.")
parser.add_argument("-t","--tabular", help="print something in tabular way for EXCEL",
                      action="store_true")
parser.add_argument("-v","--verbose", action="store_true")
args = parser.parse_args()
if args.tabular:
    print "Tabular print"
elif args.verbose:
    print "VERBOSE"

Это только тогда, когда я выполняю его следующим образом, что он печатает использование:

$ python mycode.py -h
usage: mycode.py [-h] [-t] [-v]

Prepare something code.

optional arguments:
  -h, --help     show this help message and exit
  -t, --tabular  print something in tabular way for EXCEL
  -v, --verbose

Что я хочу сделать, так это просто запустить код: $ my code.py без какой-либо опции -h для печати. Как я могу это сделать?

Ответ 1

Этот вопрос 2010 года охватывает одно и то же, но имеет только 1 ответ. Хотя этот ответ приходит косвенно из конструктора argparse, он не охватывает все возможности.

Здесь, который удивил меня своей простотой:

import sys
parser = ...
if len(sys.argv[1:])==0:
    parser.print_help()
    # parser.print_usage() # for just the usage line
    parser.exit()
args = parser.parse_args()

Да, вы можете проверить все аргументы namespace для значений по умолчанию, но это стареет, если есть много аргументов. Но здесь я просто проверяю, есть ли строки аргументов. Если нет, вызовите функцию собственной справки парсера.

ipython делает что-то подобное для создания справки. Он проверяет sys.argv на какую-то версию help и создает свои собственные справочные сообщения, прежде чем даже определить parser.

Ответ 2

import argparse
parser = argparse.ArgumentParser(description="Prepare something code.")
parser.add_argument("-t","--tabular", help="print something in tabular way for EXCEL",
                      action="store_true")
parser.add_argument("-v","--verbose", action="store_true")
args = parser.parse_args()
if args.tabular:
    print "Tabular print"
elif args.verbose:
    print "VERBOSE"
else:
    print parser.print_help()

Ответ 3

Если вам нужно использовать только один из "-t" или "-v", они не являются необязательными. Вместо этого я использовал бы позиционный параметр:

import argparse
parser = argparse.ArgumentParser(description="Prepare something code.")
parser.add_argument("type", choices=("tabular", "verbose", "t", "v"))
args = parser.parse_args()
if args.type in ("tabular", "t"):
    print "Tabular print"
else:  # Must be "verbose" or "v"
    print "VERBOSE"

Затем ваша программа вызывается с использованием одного из следующих действий:

$ my_code t
$ my_code tabular
$ my_code v
$ my_code verbose

Ни один аргумент не произведет

$ my_code
usage: my_code [-h] {tabular,verbose,t,v}
my_code: error: too few arguments