我试图将一个列表作为参数传递给命令行程序。是否有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"
编辑:结合了Katu建议的改进,删除了单独的解析步骤。
JSON列表解决方案
通过命令行处理传递列表(也包括字典)的一个好方法是使用json。
# parse_list.py
import argparse
import json
parser = argparse.ArgumentParser()
# note type arg, used to load json string
parser.add_argument('-l', '--list', type=json.loads)
args = parser.parse_args()
print(args.list)
示例使用
$ python parse_list.py -l "[265340, 268738, 270774, 270817]"
[265340, 268738, 270774, 270817]
编辑:结合了Katu建议的改进,删除了单独的解析步骤。
JSON列表解决方案
通过命令行处理传递列表(也包括字典)的一个好方法是使用json。
# parse_list.py
import argparse
import json
parser = argparse.ArgumentParser()
# note type arg, used to load json string
parser.add_argument('-l', '--list', type=json.loads)
args = parser.parse_args()
print(args.list)
示例使用
$ python parse_list.py -l "[265340, 268738, 270774, 270817]"
[265340, 268738, 270774, 270817]
如果你有一个嵌套列表,其中内部列表有不同的类型和长度,你想要保留类型,例如:
[[1,2], ["foo", "bar"], [3.14, "baz", 20]]]
然后你可以使用@sam-mason提出的解决方案来解决这个问题,如下所示:
from argparse import ArgumentParser
import json
parser = ArgumentParser()
parser.add_argument('-l', type=json.loads)
parser.parse_args(['-l', '[[1,2],["foo","bar"],[3.14,"baz",20]]'])
这使:
Namespace(l=[[1, 2], ['foo', 'bar'], [3.14, 'baz', 20]])
在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']
我更喜欢传递一个带分隔符的字符串,稍后在脚本中解析。原因是;列表可以是任何类型的int或str,有时使用nargs,如果有多个可选参数和位置参数,我会遇到问题。
parser = ArgumentParser()
parser.add_argument('-l', '--list', help='delimited list input', type=str)
args = parser.parse_args()
my_list = [int(item) for item in args.list.split(',')]
然后,
python test.py -l "265340,268738,270774,270817" [other arguments]
or,
python test.py -l 265340,268738,270774,270817 [other arguments]
会很好。分隔符也可以是空格,这将强制在参数值周围加上引号,就像问题中的示例一样。
或者你也可以使用Chepner评论中建议的lambda类型:
parser.add_argument('-l', '--list', help='delimited list input',
type=lambda s: [int(item) for item in s.split(',')])
在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]"