我试图将一个列表作为参数传递给命令行程序。是否有argparse选项传递一个列表作为选项?

parser.add_argument('-l', '--list',
                      type=list, action='store',
                      dest='list',
                      help='<Required> Set flag',
                      required=True)

脚本如下所示

python test.py -l "265340 268738 270774 270817"

当前回答

您可以将列表解析为字符串,并使用eval内置函数将其作为列表读取。在这种情况下,为了确保成功地解析字符串,必须将单引号(或双引号)放入双引号中。

# declare the list arg as a string
parser.add_argument('-l', '--list', type=str)

# parse
args = parser.parse()

# turn the 'list' string argument into a list object
args.list = eval(args.list)
print(list)
print(type(list))

测试:

python list_arg.py --list "[1, 2, 3]"

[1, 2, 3]
<class 'list'>

其他回答

请注意,如果你传递action='append'和默认参数,Argparse将尝试附加到提供的默认值,而不是替换默认值,这可能是你所期望的,也可能不是。

下面是Argparse Docs中给出的一个action='append示例。 在这种情况下,事情将如预期的那样工作:

>> import argparse
>> parser = argparse.ArgumentParser()
>> parser.add_argument('--foo', action='append')
>> parser.parse_args('--foo 1 --foo 2'.split())

Out[2]: Namespace(foo=['1', '2'])

然而,如果你选择提供一个默认值,Argparse的"append"操作将尝试附加到提供的默认值,而不是替换默认值:

import argparse
REASONABLE_DEFAULTS = ['3', '4']
parser = argparse.ArgumentParser()
parser.add_argument('--foo', default=REASONABLE_DEFAULTS,action='append')
parser.parse_args('--foo 1 --foo 2'.split())

Out[6]: Namespace(foo=['3', '4', '1', '2'])

如果你希望Argparse替换默认值——比如传入一个元组作为默认值,而不是一个列表——这可能会导致一些令人困惑的错误:

import argparse
REASONABLE_DEFAULTS = ('3', '4')
parser = argparse.ArgumentParser()
parser.add_argument('--foo', default=REASONABLE_DEFAULTS,action='append')
parser.parse_args('--foo 1 --foo 2'.split())

AttributeError: 'tuple' object has no attribute 'append'

有一个跟踪这种意外行为的bug,但由于它可以追溯到2012年,所以不太可能得到解决。

我想处理传递多个列表,整数值和字符串。

如何将Bash变量传递给Python?

def main(args):
    my_args = []
    for arg in args:
        if arg.startswith("[") and arg.endswith("]"):
            arg = arg.replace("[", "").replace("]", "")
            my_args.append(arg.split(","))
        else:
            my_args.append(arg)

    print(my_args)


if __name__ == "__main__":
    import sys
    main(sys.argv[1:])

秩序并不重要。如果你想传递一个列表,只需在“[”和“]之间做,并用逗号分隔它们。

然后,

python test.py my_string 3 "[1,2]" "[3,4,5]"

Output => ['my_string', '3', ['1', '2'], ['3', '4', '5']]], my_args变量按顺序包含参数。

在add_argument()中,type只是一个可调用的对象,它接收字符串并返回选项值。

import ast

def arg_as_list(s):                                                            
    v = ast.literal_eval(s)                                                    
    if type(v) is not list:                                                    
        raise argparse.ArgumentTypeError("Argument \"%s\" is not a list" % (s))
    return v                                                                   


def foo():
    parser.add_argument("--list", type=arg_as_list, default=[],
                        help="List of values")

这将允许:

$ ./tool --list "[1,2,3,4]"

您可以将列表解析为字符串,并使用eval内置函数将其作为列表读取。在这种情况下,为了确保成功地解析字符串,必须将单引号(或双引号)放入双引号中。

# declare the list arg as a string
parser.add_argument('-l', '--list', type=str)

# parse
args = parser.parse()

# turn the 'list' string argument into a list object
args.list = eval(args.list)
print(list)
print(type(list))

测试:

python list_arg.py --list "[1, 2, 3]"

[1, 2, 3]
<class 'list'>

在argparse的add_argument方法中使用nargs参数

我使用nargs='*'作为add_argument参数。如果我没有传递任何显式参数,我特别使用nargs='*'选项来选择默认值

包括一个代码片段作为示例:

例如:temp_args1.py

请注意:下面的示例代码是用python3编写的。通过改变打印语句的格式,可以在python2中运行

#!/usr/local/bin/python3.6

from argparse import ArgumentParser

description = 'testing for passing multiple arguments and to get list of args'
parser = ArgumentParser(description=description)
parser.add_argument('-i', '--item', action='store', dest='alist',
                    type=str, nargs='*', default=['item1', 'item2', 'item3'],
                    help="Examples: -i item1 item2, -i item3")
opts = parser.parse_args()

print("List of items: {}".format(opts.alist))

注意:我正在收集多个字符串参数,这些参数存储在list - opt . list中 如果需要整数列表,请更改解析器上的类型参数。Add_argument到int

执行结果:

python3.6 temp_agrs1.py -i item5 item6 item7
List of items: ['item5', 'item6', 'item7']

python3.6 temp_agrs1.py -i item10
List of items: ['item10']

python3.6 temp_agrs1.py
List of items: ['item1', 'item2', 'item3']