从文件读取参数

先读取文件参数,然后读取命令行参数的实现方法如下:
此时args.txt文件里的内容如下:
—seed=2
—format=txt
同时,在调用时,传递命令行参数为:—c=csv —file=args.txt

  1. import argparse
  2. class LoadFromFile(argparse.Action):
  3. def __call__(self, parser, namespace, values, option_string=None):
  4. with values as f:
  5. # parse arguments in the file and store them in the target namespace
  6. parser.parse_args(f.read().split(), namespace)
  7. argparser = argparse.ArgumentParser()
  8. argparser.add_argument('--seed', type=int, default=1)
  9. argparser.add_argument('--c', type=str, default='json')
  10. argparser.add_argument('--format', type=str, default='json')
  11. argparser.add_argument('--file', type=open, action=LoadFromFile, default=argparse.SUPPRESS)
  12. args = argparser.parse_args()
  13. print(args)
  14. -- output
  15. Namespace(c='csv', format='json', seed=1)

当然,也可以进行更复杂的操作,例如只更新某些参数,或者从json文件等读,本质上,就是给一个回调函数,然后更新namespace即可:

  1. def __call__ (self, parser, namespace, values, option_string=None):
  2. with values as f:
  3. contents = f.read()
  4. # parse arguments in the file and store them in a blank namespace
  5. data = parser.parse_args(contents.split(), namespace=None)
  6. for k, v in vars(data).items():
  7. # set arguments in the target namespace if they haven’t been set yet
  8. if getattr(namespace, k, None) is not None:
  9. setattr(namespace, k, v)