从文件读取参数
先读取文件参数,然后读取命令行参数的实现方法如下:
此时args.txt文件里的内容如下:
—seed=2
—format=txt
同时,在调用时,传递命令行参数为:—c=csv —file=args.txt
import argparse
class LoadFromFile(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
with values as f:
# parse arguments in the file and store them in the target namespace
parser.parse_args(f.read().split(), namespace)
argparser = argparse.ArgumentParser()
argparser.add_argument('--seed', type=int, default=1)
argparser.add_argument('--c', type=str, default='json')
argparser.add_argument('--format', type=str, default='json')
argparser.add_argument('--file', type=open, action=LoadFromFile, default=argparse.SUPPRESS)
args = argparser.parse_args()
print(args)
-- output
Namespace(c='csv', format='json', seed=1)
当然,也可以进行更复杂的操作,例如只更新某些参数,或者从json文件等读,本质上,就是给一个回调函数,然后更新namespace即可:
def __call__ (self, parser, namespace, values, option_string=None):
with values as f:
contents = f.read()
# parse arguments in the file and store them in a blank namespace
data = parser.parse_args(contents.split(), namespace=None)
for k, v in vars(data).items():
# set arguments in the target namespace if they haven’t been set yet
if getattr(namespace, k, None) is not None:
setattr(namespace, k, v)