您可以通过使用argparse.Action
打开文件,解析文件内容然后添加参数的自定义方法来解决此问题。
例如,这将是一个非常简单的操作:
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)
您可以这样使用:
parser = argparse.ArgumentParser()
# other arguments
parser.add_argument('--file', type=open, action=LoadFromFile)
args = parser.parse_args()
然后,结果中的名称空间args
还将包含从文件中加载的任何配置,其中该文件包含与命令行(例如--foo 1 --bar 2
)语法相同的参数。
如果您需要更复杂的解析,还可以先分别解析文件内配置,然后有选择地选择应该接管的值。例如,由于按照指定的顺序对参数进行了评估,因此防止文件中的配置覆盖命令行上明确指定的值可能是有意义的。这将允许使用配置文件作为默认值:
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)
当然,您还可以使文件读取稍微复杂一些,例如首先从JSON读取。