假设我有一个使用argparse处理命令行参数/选项的程序。下面将打印“帮助”信息:
./myprogram -h
or:
./myprogram --help
但是,如果我不带任何参数运行脚本,它什么都不会做。我想要它做的是在不带参数地调用它时显示用法消息。怎么做呢?
假设我有一个使用argparse处理命令行参数/选项的程序。下面将打印“帮助”信息:
./myprogram -h
or:
./myprogram --help
但是,如果我不带任何参数运行脚本,它什么都不会做。我想要它做的是在不带参数地调用它时显示用法消息。怎么做呢?
当前回答
这是一个很简单的答案。大多数时候使用argparse是为了检查是否设置了形参,以便调用函数来执行某些操作。
如果没有参数,则在最后输出else并打印帮助。简单而有效。
import argparse
import sys
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("--holidays", action='store_true')
group.add_argument("--people", action='store_true')
args=parser.parse_args()
if args.holidays:
get_holidays()
elif args.people:
get_people()
else:
parser.print_help(sys.stderr)
其他回答
我喜欢让事情尽可能简单,这很有效:
#!/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)
这就是我如何开始我的所有工具,因为它总是好的包括一些例子
当调用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
把我的版本扔到这里:
import argparse
parser = argparse.ArgumentParser()
args = parser.parse_args()
if not vars(args):
parser.print_help()
parser.exit(1)
您可能会注意到解析器。exit -我这样做主要是因为它保存了一个导入行,如果这是文件中sys的唯一原因…
这个答案来自谷歌groups的Steven Bethard。我在这里重新发布它,让没有谷歌账户的人更容易访问。
你可以重写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()
请注意,上面的解决方案将打印帮助消息每当出现错误 方法触发。例如,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()默认情况下打印到标准输出。正如init_js所建议的,使用parser.print_help(sys.stderr)来打印到stderr。
如果你必须为脚本运行指定参数,使用ArgumentParser所需的参数,如下所示
parser.add_argument('--foo', required=True)
如果脚本在没有任何参数的情况下运行,Parse_args()将报告错误。