在没有参数时使用Python argparse显示帮助信息
假设我有一个程序,它使用 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)。