【问题标题】:How to make argparse print usage when no option is given to the code [duplicate]当代码没有选项时如何使用argparse打印[重复]
【发布时间】:2014-04-17 14:05:44
【问题描述】:

使用以下代码:

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 选项来打印使用情况。我该怎么做?

【问题讨论】:

  • 如果您希望使用 -t-v 中的一个,您可以考虑使用一个带有 choices=("tabular", "t", "verbose", "v") 的位置参数。
  • 那个 2010 年的问题只有 1 个答案,而且不是一个特别简单或明显的问题。
  • @chepner:你能给出具体的代码吗?你说得对,我只需要使用 -t 或 -v 之一。

标签: python argparse


【解决方案1】:
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()

【讨论】:

    【解决方案2】:

    2010 年的问题涵盖相同的内容,但只有 1 个答案。虽然这个答案间接来自argparse 的设计者,但它并未涵盖所有可能性。

    这是一个让我惊讶的简单性:

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

    是的,您可以检查所有 namespace 参数的默认值,但如果有很多参数,它就会变旧。但在这里我只是检查是否有任何参数字符串。如果没有,则调用解析器自己的帮助函数。

    ipython 执行类似的操作来生成帮助。它会检查 sys.argv 中的某个版本的 help,并在定义 parser 之前生成自己的帮助消息。

    【讨论】:

    • 如果您只有一堆可选参数,但程序需要至少一个提供的参数来做有意义的事情,这比替代方案要简单得多。
    • len(sys.argv[1:])==0 是写len(sys.argv)==1 的冗长方式。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多