您可以通过使用
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 argumentsparser.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读取。



