Python 将带有参数的dict传递给argparse
我使用的代码库需要通过使用argparse库的命令行调用大量参数,我需要在循环中调用该代码,并通过字典而不是通过命令行注入参数,而不更改该代码库,我调用代码如下:Python 将带有参数的dict传递给argparse,python,argparse,Python,Argparse,我使用的代码库需要通过使用argparse库的命令行调用大量参数,我需要在循环中调用该代码,并通过字典而不是通过命令行注入参数,而不更改该代码库,我调用代码如下: parser = argparse.ArgumentParser('Training', parents=[get_args_parser()]) args = parser.parse_args() main(args) args_to_argdict = {'a':1 , 'b':49 ,'c': 'text' }
parser = argparse.ArgumentParser('Training', parents=[get_args_parser()])
args = parser.parse_args()
main(args)
args_to_argdict = {'a':1 , 'b':49 ,'c': 'text' }
parser = argparse.ArgumentParser(parents=[get_args_parser()])
args = parser.parse_args()
arg_dict = vars(args)
for key,value in args_to_argdict.items():
arg_dict[key]= value
其中get_args_parser()是一个参数和默认值的大列表,例如:
def get_args_parser():
parser = argparse.ArgumentParser('Set transformer detector', add_help=False)
parser.add_argument('--lr', default=1e-4, type=float)
parser.add_argument('--lr_backbone', default=1e-5, type=float)
parser.add_argument('--batch_size', default=2, type=int)
parser.add_argument('--weight_decay', default=1e-4, type=float)
parser.add_argument('--epochs', default=300, type=int)
parser.add_argument('--lr_drop', default=200, type=int)
如果我需要传递字典,作为参数,例如:
argdict = {'lr_drop':20,'batch_size':5}
我该怎么做?您应该这样使用:
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dict", required=True, help="Your dict as string", default="{}")
args = vars(ap.parse_args())
argdict = eval(args["dict"])
print(argdict)
# or you cam print some dict specific var
print(argdict["name"]) #Jasar
您可以这样调用您的文件:
python3 file.py -d '{"name":"Jasar"}'
根据@Jaser和@chepner的一些线索,我做了如下工作:
parser = argparse.ArgumentParser('Training', parents=[get_args_parser()])
args = parser.parse_args()
main(args)
args_to_argdict = {'a':1 , 'b':49 ,'c': 'text' }
parser = argparse.ArgumentParser(parents=[get_args_parser()])
args = parser.parse_args()
arg_dict = vars(args)
for key,value in args_to_argdict.items():
arg_dict[key]= value
使args值发生变化,然后我运行main:
main(args)
使用修改后的args。从
dict
构造一个argparse.Namespace
对象,并将其传递给main
,而不是使用新的解析器:main(argparse.Namespace(*argdict))
。首先,执行打印(args)
,以查看常规解析生成的内容vars(args)
以dict形式显示名称空间
。您可以使用自己的argv
参数调用解析器:args=parser.parse_args(argv)
,但是argv
必须插入从命令行获得的sys.argv[1://code>列表。