假设我有一个使用argparse处理命令行参数/选项的程序。下面将打印“帮助”信息:
./myprogram -h
or:
./myprogram --help
但是,如果我不带任何参数运行脚本,它什么都不会做。我想要它做的是在不带参数地调用它时显示用法消息。怎么做呢?
假设我有一个使用argparse处理命令行参数/选项的程序。下面将打印“帮助”信息:
./myprogram -h
or:
./myprogram --help
但是,如果我不带任何参数运行脚本,它什么都不会做。我想要它做的是在不带参数地调用它时显示用法消息。怎么做呢?
当前回答
对于argparse,你可以使用ArgumentParser.print_usage():
parser.argparse.ArgumentParser()
# parser.add_args here
# sys.argv includes a list of elements starting with the program
if len(sys.argv) < 2:
parser.print_usage()
sys.exit(1)
打印帮助 ArgumentParser.print_usage(文件=没有) 打印关于如何在命令行上调用ArgumentParser的简要描述。如果file为None,则sys。假设是Stdout。
其他回答
如果你为(sub)解析器关联默认函数,就像在add_subparsers中提到的那样,你可以简单地将它作为默认动作添加:
parser = argparse.ArgumentParser()
parser.set_defaults(func=lambda x: parser.print_usage())
args = parser.parse_args()
args.func(args)
如果由于缺少位置参数而引发异常,则添加try-except。
最简洁的解决方案是手动传递默认参数,如果没有在命令行中给出:
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))
如果调用w/o参数,这将打印完整的帮助(而不是简短的用法)。
这种方法比大多数其他方法要优雅得多。与其重写error(),你可以通过包装parse_args()方法来更精确地控制行为:
import sys
import argparse
HelpFlags = ('help', '--help', '-h', '/h', '?', '/?', )
class ArgParser (argparse.ArgumentParser):
def __init__(self, *args, **kws):
super().__init__(*args, **kws)
def parse_args(self, args=None, namespace=None):
if args is None:
args = sys.argv[1:]
if len(args) < 1 or (args[0].lower() in HelpFlags):
self.print_help(sys.stderr)
sys.exit()
return super().parse_args(args, namespace)
有一对带有sys。argv[1:](一个非常常见的Python习语,用于引用命令行参数,即sys. argv[1:])。Argv[0]脚本的名称),可以完成这项工作。
第一个是不言自明的、干净的、python式的:
args = parser.parse_args(None if sys.argv[1:] else ['-h'])
第二个问题有点棘手。结合前面评估的事实,一个空列表是False与True == 1和False == 0等价,你得到:
args = parser.parse_args([None, ['-h']][not sys.argv[1:]])
也许括号太多了,但如果之前做了参数选择就很清楚了。
_, *av = sys.argv
args = parser.parse_args([None, ['-h']][not av])
如果你必须为脚本运行指定参数,使用ArgumentParser所需的参数,如下所示
parser.add_argument('--foo', required=True)
如果脚本在没有任何参数的情况下运行,Parse_args()将报告错误。