Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将带有参数的dict传递给argparse_Python_Argparse - Fatal编程技术网

Python 将带有参数的dict传递给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' }

我使用的代码库需要通过使用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(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>列表。