我正在尝试构建一个看起来像“ scriptName -s arg1 arg2 ... -d ...”的cli解析器。因此,我尝试将-s之后的所有数据附加到列表中(最后添加到字典中)并返回。
以下是我正在使用的功能:
def split_data(cli_args):
dict_args = {}
local_list = []
for i in range(1,len(cli_args)):
if(cli_args[i] == '-s'):
try:
i = i + 1
while(cli_args[i] != '-d'):
print("while",(cli_args[i]))
local_list.append(cli_args[i])
i = i + 1
print("local_list",local_list)
dict_args.update({"options" : local_list})
except BaseException as err:
print(str(err))
break
print(dict_args)
return dict_args
结果给出:
while arg1
local_list ['arg1']
while arg2
local_list ['arg1', 'arg2']
list index out of range
{}
但是,如果要将while
循环(完整循环)包装在try: except:pass
中,则最终的字典会保留数据,为什么呢?
while arg1
local_list ['arg1']
while arg2
local_list ['arg1', 'arg2']
list index out of range
{"options" : ['arg1', 'arg2']}
答案 0 :(得分:0)
我建议使用python的argparse模块。它确实做到了这一点,还有更多。 https://docs.python.org/3/library/argparse.html。
您可以设置可选参数。布尔参数。 arguments = value就像参数一样,甚至对它们做一些逻辑,例如汇总值。
但是,如果您确实要执行此操作:
listargs = False
dict_args = {}
lst = []
for i in cli_args:
if i == "-d":
listargs = True
if listargs:
lst.append(i)
if i == "-s":
listargs = False
dict_args["options"] = lst
lst = []