如何从命名空间字符串加载argparse?

时间:2018-06-15 06:03:22

标签: python argparse

import argparse
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
parser.add_argument('--a', default=1)
args = parser.parse_args()

然后我将args存储到文件中:

with open('/tmp/a', 'w') as f:
    f.write(str(args))

文件中的内容就是这样:

Namespace(a='2')

那么,如何将此字符串加载到args中?

2 个答案:

答案 0 :(得分:0)

刚测试过它 - pickle适用于argparse.Namespace对象:

In [727]: import pickle
In [728]: pickle.dumps(argparse.Namespace(a=10))
Out[728]: b'\x80\x03cargparse\nNamespace\nq\x00)\x81q\x01}q\x02X\x01\x00\x00\x00aq\x03K\nsb.'
In [729]: pickle.loads(_)
Out[729]: Namespace(a=10)

这需要导入argparse

和我在评论中建议的字典泡菜:

In [730]: pickle.dumps(vars(_))
Out[730]: b'\x80\x03}q\x00X\x01\x00\x00\x00aq\x01K\ns.'
In [731]: pickle.loads(_)
Out[731]: {'a': 10}

答案 1 :(得分:0)

  1 import argparse
  2 from argparse import Namespace
  3 
  4 parser = argparse.ArgumentParser()
  5 parser.add_argument('--a', default=1)
  6 args = parser.parse_args()
  7 
  8 import os
  9 if os.path.exists('/tmp/a'):
 10     with open('/tmp/a', 'r') as f:
 11         ns = f.read()
 12         print(ns)
 13         args = parser.parse_args(namespace=eval(ns))
 14 else:
 15     with open('/tmp/a', 'w') as f:
 16         f.write(str(args))
 17         
 18 print(args.a)

因为字符串Namespace(a='2')来自命名空间实例,所以我们可以评估它。