假设我有一个使用argparse处理命令行参数/选项的程序。下面将打印“帮助”信息:
./myprogram -h
or:
./myprogram --help
但是,如果我不带任何参数运行脚本,它什么都不会做。我想要它做的是在不带参数地调用它时显示用法消息。怎么做呢?
假设我有一个使用argparse处理命令行参数/选项的程序。下面将打印“帮助”信息:
./myprogram -h
or:
./myprogram --help
但是,如果我不带任何参数运行脚本,它什么都不会做。我想要它做的是在不带参数地调用它时显示用法消息。怎么做呢?
当前回答
可以使用try/except来代替编写类
try:
options = parser.parse_args()
except:
parser.print_help()
sys.exit(0)
好处是工作流更加清晰,并且不需要存根类。缺点是第一个“usage”行打印了两次。
这至少需要一个强制参数。如果没有强制参数,在命令行上提供零参数是有效的。
其他回答
把我的版本扔到这里:
import argparse
parser = argparse.ArgumentParser()
args = parser.parse_args()
if not vars(args):
parser.print_help()
parser.exit(1)
您可能会注意到解析器。exit -我这样做主要是因为它保存了一个导入行,如果这是文件中sys的唯一原因…
如果您的命令是用户需要选择某些操作的命令,则使用互斥组required=True。
这是对pd321给出的答案的扩展。
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--batch", action='store', type=int, metavar='pay_id')
group.add_argument("--list", action='store_true')
group.add_argument("--all", action='store_true', help='check all payments')
args=parser.parse_args()
if args.batch:
print('batch {}'.format(args.batch))
if args.list:
print('list')
if args.all:
print('all')
输出:
$ python3 a_test.py 用法:a_test.py [h](——批pay_id | - |列表) A_test.py: error:参数之一——batch——list——all是必需的
这只是基本的帮助。其他的一些答案会给你充分的帮助。但至少你的用户知道他们可以做-h
当调用add_subparsers方法时,将第一个位置参数保存为dest=,并在argparse初始化后检查值,如下所示:
介子
检查一下这个变量:
if not args.command:
parser.print_help()
parser.exit(1) # If exit() - exit code will be zero (no error)
完整的例子:
#!/usr/bin/env python
""" doc """
import argparse
import sys
parser = argparse.ArgumentParser(description=__doc__)
subparsers = parser.add_subparsers(dest='command',
help='List of commands')
list_parser = subparsers.add_parser('list',
help='List contents')
list_parser.add_argument('dir', action='store',
help='Directory to list')
create_parser = subparsers.add_parser('create',
help='Create a directory')
create_parser.add_argument('dirname', action='store',
help='New directory to create')
create_parser.add_argument('--read-only', default=False, action='store_true',
help='Set permissions to prevent writing to the directory')
args = parser.parse_args()
if not args.command:
parser.print_help()
parser.exit(1)
print(vars(args)) # For debug
对于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。
我喜欢让事情尽可能简单,这很有效:
#!/usr/bin/env python3
Description = """Tool description"""
Epilog = """toolname.py -a aflag -b bflag with these combined it does blah"""
arg_parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description=Description,
epilog=Epilog,
)
try:
if len(sys.argv) == 1:
arg_parser.print_help()
except Exception as e:
print(e)
这就是我如何开始我的所有工具,因为它总是好的包括一些例子