如何检查并引发没有命令行参数的错误

Posted

技术标签:

【中文标题】如何检查并引发没有命令行参数的错误【英文标题】:How to Check for and raise an error for no command line argument 【发布时间】:2013-12-15 03:07:28 【问题描述】:

我有一个 argparsing 程序:

导入参数解析

def main():
    p = argparse.ArgumentParser()
    help_str = 'rule': 'Blah blah blah and stuff.'
    p.add_argument('-r', '--rule', action="store", type=str, dest='rule', help=help_str['rule'])
    p.set_defaults(rule='string')
    args = p.parse_args()

因此,我的命令行输入:

username@compname:~$python progname.py -r/--rule 'something'

我想弄清楚我如何才能输入:

username@compname:~$python progname.py -r/--rule

并出现我自己的错误消息:

print '\n    Error: no input value for rule:'
print '    resetting rule to default value.'
args.rule = 'string'

在此之后,规则值应打印为“字符串”

对不起,我对 Python 的理解只有一点点。我尝试过使用 try/except 块,甚至 sys.argv[2] (尽管我可能做错了什么。)这是我所有解决方案中不断出现的错误(对类型和值之外的错误不太熟悉) :

progname.py: error: argument -r/--rule: expected one argument

任何帮助表示赞赏。

【问题讨论】:

nvrmnd,问题解决了 【参考方案1】:
p = argparse.ArgumentParser()
p.add_argument('-r', '--rule', nargs='?', default='string')
args = p.parse_args()
print args

如果在没有参数的情况下调用nargs='?',则生成Namespace(rule='string')。对于-r,args 是Namespace(rule=None)。还有Namespace(rule='something')-r something

让我们添加几行代码

if args.rule is None:
    print '\n    Error: no input value for rule:'
    print '    resetting rule to default value.'
    args.rule = 'string'
print args

现在带有'-r'(或--rule)的输出是:

Namespace(rule=None)

    Error: no input value for rule:
    resetting rule to default value.
Namespace(rule='string')

其他情况同理。

如果我放弃default; p.add_argument('-r', '--rule', nargs='?'),没有参数的情况也会产生这个自定义的“错误消息”,因为默认(在 argparse 中)是 None

可以使用自定义typeaction 添加自定义错误检查,但我认为在使用argparse 之后测试None 更简单,也更容易理解。

我建议将 error message 更改为 warning。错误通常会终止程序;警告会打印消息并继续。


这是nargs=2 时的解决方案(或其他已修复的问题)。这不是一个微不足道的更改,因为它涉及重新定义 error 方法(记录在 argparse 文档的末尾附近),然后捕获它产生的错误。 error 方法不能访问命名空间(args),也不能继续parse_args。因此,如果 rule 参数有问题,它无法处理任何其他参数。

class MyParser(argparse.ArgumentParser):
    def error(self, message):
        if 'rule' in message:
            message = 'wrong number of input values for rule'
            raise argparse.ArgumentError(None,message)
            # cannot access namespace or continue parsing
        else:
            super(MyParser, self).error(message)

p = MyParser()
p.add_argument('-r', '--rule', nargs=2)
try:
    args = p.parse_args()
except argparse.ArgumentError as e:
    print e
    args = argparse.Namespace(rule='default')
    # create a namespace with this default value
print args

请记住,nargs 有 2 个用途: - 如果给出错误数量的参数字符串,则引发错误 - 在多个Action之间分配多个参数字符串(add_argument创建的东西)。

例如,如果您有多个位置,分别采用 1,2 和 * 参数,则第二个尤其明显。它是 argparse 的一个关键新特性,至少相对于早期的 Python 解析器而言。虽然可以对其进行调整,但很难完全重新定义它。

如果参数允许,您可以使用nargs='*' 代替“?”,如果字符串数不是“2”(或其他),则发出警告。

【讨论】:

谢谢,这让我发疯了。如果您已经有一个带有必要数值的 narg 语句怎么办?有解决办法吗? 我添加了一个重新定义parser.error方法的部分解决方案。

以上是关于如何检查并引发没有命令行参数的错误的主要内容,如果未能解决你的问题,请参考以下文章

求助大神,命令行选项语法错误,怎么解决

如何检查命令行参数是不是为整数

创建一个shell,检查命令行参数个数,如果参数不是三个,则显示一条错误信息

无法弄清楚如何正确存储命令行参数[关闭]

Java:检查命令行参数是不是为空

在 Wix 中获取命令行参数