假设我有一个使用argparse处理命令行参数/选项的程序。下面将打印“帮助”信息:

./myprogram -h

or:

./myprogram --help

但是,如果我不带任何参数运行脚本,它什么都不会做。我想要它做的是在不带参数地调用它时显示用法消息。怎么做呢?


当前回答

有一对带有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])

其他回答

把我的版本扔到这里:

import argparse

parser = argparse.ArgumentParser()
args = parser.parse_args()
if not vars(args):
    parser.print_help()
    parser.exit(1)

您可能会注意到解析器。exit -我这样做主要是因为它保存了一个导入行,如果这是文件中sys的唯一原因…

这是一个很简单的答案。大多数时候使用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)

当调用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

如果你必须为脚本运行指定参数,使用ArgumentParser所需的参数,如下所示

parser.add_argument('--foo', required=True)

如果脚本在没有任何参数的情况下运行,Parse_args()将报告错误。

这并不好(因为会拦截所有错误),但是:

def _error(parser):
    def wrapper(interceptor):
        parser.print_help()

        sys.exit(-1)

    return wrapper

def _args_get(args=sys.argv[1:]):
    parser = argparser.ArgumentParser()

    parser.error = _error(parser)

    parser.add_argument(...)
    ...

下面是ArgumentParser类的错误函数的定义。

如您所见,下面的签名有两个参数。然而,类之外的函数对第一个参数self一无所知,因为粗略地说,这个参数是类的。

def _error(self, message):
    self.print_help()

    sys.exit(-1)

def _args_get(args=sys.argv[1:]):
    parser = argparser.ArgumentParser()

    parser.error = _error
    ...

将输出:

"AttributeError: 'str' object has no attribute 'print_help'"

你可以在_error函数中传递parser (self),通过调用它:

def _error(self, message):
    self.print_help()

    sys.exit(-1)

def _args_get(args=sys.argv[1:]):
    parser = argparser.ArgumentParser()

    parser.error = _error(parser)
    ...

但是如果你现在不想退出程序,返回它:

def _error(parser):
    def wrapper():
        parser.print_help()

        sys.exit(-1)

    return wrapper

尽管如此,解析器并不知道它已被修改。因此,当发生错误时,它将打印错误的原因(顺便说一下,这是一个本地化的翻译)。所以截取它:

def _error(parser):
    def wrapper(interceptor):
        parser.print_help()

        sys.exit(-1)

    return wrapper

现在,当发生错误时,解析器将打印错误的原因,您将拦截它,查看它,然后……扔掉。