在没有参数时使用Python argparse显示帮助信息

335 投票
18 回答
234057 浏览
提问于 2025-04-16 06:14

假设我有一个程序,它使用 argparse 来处理命令行的参数和选项。下面的代码会打印出“帮助”信息:

./myprogram -h

或者:

./myprogram --help

但是,如果我运行这个脚本而不输入任何参数,它就不会做任何事情。我希望它在没有输入参数时能显示使用说明信息。这个怎么实现呢?

18 个回答

74

最简单的解决办法就是如果命令行没有提供参数,就手动传入默认参数:

parser.parse_args(args=None if sys.argv[1:] else ['--help'])

完整的例子:

import argparse, sys

parser = argparse.ArgumentParser()
parser.add_argument('--host', default='localhost', help='Host to connect to')
# parse arguments
args = parser.parse_args(args=None if sys.argv[1:] else ['--help'])

# use your args
print("connecting to {}".format(args.host))

如果没有传入任何参数,这段代码会打印出完整的帮助信息(而不是简短的使用说明)。

95

可以用try/except来代替写一个类。

try:
    options = parser.parse_args()
except:
    parser.print_help()
    sys.exit(0)

这样做的好处是流程更清晰,而且不需要一个空的类。缺点是第一行“使用”的信息会打印两次。

这至少需要一个必填的参数。如果没有必填参数,那么在命令行上提供零个参数也是可以的。

387

这个回答来自Steven Bethard,原文在Google群组。我把它重新发在这里,方便没有Google账号的人查看。

你可以改变error方法的默认行为:

import argparse
import sys

class MyParser(argparse.ArgumentParser):
    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        self.print_help()
        sys.exit(2)

parser = MyParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()

注意,上面的解决方案会在每次触发error方法时打印帮助信息。例如,如果你输入test.py --blah,而--blah不是一个有效的选项,那么也会打印帮助信息。

如果你只想在命令行没有提供任何参数时打印帮助信息,那么也许这仍然是最简单的方法:

import argparse
import sys

parser=argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
if len(sys.argv)==1:
    parser.print_help(sys.stderr)
    sys.exit(1)
args=parser.parse_args()

注意,parser.print_help()默认是打印到标准输出(stdout)。正如init_js建议的那样,可以使用parser.print_help(sys.stderr)来打印到标准错误输出(stderr)。

撰写回答