Argparse:检查是否已传递任何参数

问题描述 投票:40回答:6

当没有给出参数时,我的脚本应该启动演示模式。我试过这个:

args = parser.parse_args()
if len(args) == 0:
    run_demo()
else:
    # evaluate args

这给*** TypeError: object of type 'Namespace' has no len()作为args没有列表。

我怎样才能达到我想要的目标?

python command-line-arguments argparse
6个回答
65
投票

如果您的目标是检测何时没有给出命令的参数,那么通过argparse执行此操作是错误的方法(正如Ben已经很好地指出的那样)。

想想简单! :-)我相信argparse不会减少sys.argv。所以,if not len(sys.argv) > 1,然后用户没有提供任何参数。


16
投票

argparse允许您根据规范和要解析的命令行设置(在Namespace对象内)您添加到解析器的参数中提到的所有变量。如果设置了默认值,那么这些变量将具有该默认值(如果在命令行中未显示它们),它们将不会在Namespace对象中不存在。如果您没有指定默认值,则隐含默认值为None。因此,检查Namespace对象的长度,但是你设法做到这一点,作为检查是否解析了任何参数的方法没有意义;它应该始终具有相同的长度。

相反,如果你知道你有一堆没有默认值的参数,你想检查它们中的任何一个是否被设置为任何非None值......那样做。您可以使用列表推导和vars函数来循环它们,而不必复制add_argument调用中的名称列表,如Martijn的答案所示。

如果你的一些参数有默认值,它会变得有点棘手,如果它们具有可以在命令行上显式提供的默认值,那就更难了(例如,默认为0的数字参数使得无法告诉用户默认值提供0)。在那种情况下,我不确定是否有一个通用的解决方案总能在不知道参数是什么的情况下工作。


6
投票

如果一个人确实需要参数号(无论出于何种原因)。我发现这段代码非常有用(但不知道它有多少优化,我很感激任何评论)。

args = parser.parse_args()
print( len( vars(args) ) )

此版本仅计算-xx参数,而不计算任何传递的其他值。

如果一个人想要所有东西(也是传递的值),那么只需使用前面提到的len(sys.argv)


5
投票

不要使用argparse。而只是使用sys.argvargparse创建一个命名空间,因此它总是会给你一个带有值的“dict”,具体取决于你在调用脚本时使用的参数。

这是我过去做过的事情:

args = parser.parse_args()
if len(sys.argv) == 1:
    parser.print_help()
    sys.exit()
return args

2
投票

让我们假设以下示例来扩展您的完整性:

#!/usr/bin/env python3

import argparse

...
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('input', nargs='?' action='store')
    parser.add_argument('-l', '--length', type=int, action='store')
    parser.add_argument('-v', '--verbose', action='store_true')
    args = parser.parse_args()
    if (args.input == None and args.length == None):
        parser.print_help()
    else:
        print(args)

if __name__ == '__main__':
    main()

@Ben在此示例中提到的Namespace对象是args。从parser.add_argument中的字符串创建变量。您可以通过args.inputargs.lengthargs.verbose访问它。您可以通过执行print(args)来验证这一点,这将实际显示如下:

Namespace(input=None, length=None, verbose=False)

因为verbose设置为True,如果存在,输入和长度只是变量,不必实例化(不提供参数)。

group = parser.add_mutually_exclusive_group()也很有用,如果你想确保,两个属性不能同时提供。

如需进一步参考,请参阅:


1
投票

我扩展了2dvisio的概念来计算非零或无参数:

vm_opts = parser.parse_args()
v = vars(vm_opts)
n_args = sum([ 1 for a in v.values( ) if a])
© www.soinside.com 2019 - 2024. All rights reserved.