如何让argparse在没有给出选项时打印用法

21 投票
3 回答
29499 浏览
提问于 2025-04-17 22:03

以下是代码:

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选项,也能打印出用法。我该怎么做呢?

3 个回答

1

如果你需要在"-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
3

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个特定的功能时,发现它没有按照预期工作。这种情况很常见,很多人都会在网上寻求帮助,像StackOverflow这样的论坛就是一个很好的地方。

在这些论坛上,大家会分享自己的问题和解决方案。你可以看到很多人提出的问题,和他们得到的回答。通过这些讨论,我们可以学到很多东西,了解如何解决类似的问题。

总之,编程的学习过程就是不断尝试和解决问题的过程。遇到困难时,不要气馁,去寻找答案,和其他人交流,慢慢你就会掌握更多的知识。

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

那个2010年的问题讲的也是这个,但只有一个答案。虽然这个答案是间接来自于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之前就生成自己的帮助信息。

撰写回答