<p>您可以使用自定义<a href="https://docs.python.org/3/library/argparse.html#argparse.Action" rel="noreferrer">^{<cd1>}</a>来解决这个问题,该自定义<a href="https://docs.python.org/3/library/argparse.html#argparse.Action" rel="noreferrer">^{<cd1>}</a>打开文件,解析文件内容,然后添加参数。</p>
<p>例如,这将是一个非常简单的操作:</p>
<pre><code>class LoadFromFile (argparse.Action):
def __call__ (self, parser, namespace, values, option_string = None):
with values as f:
parser.parse_args(f.read().split(), namespace)
</code></pre>
<p>你可以这样使用:</p>
<pre><code>parser = argparse.ArgumentParser()
# other arguments
parser.add_argument('--file', type=open, action=LoadFromFile)
args = parser.parse_args()
</code></pre>
<p>然后,<code>args</code>中的结果命名空间也将包含从文件加载的任何配置。</p>
<p>如果需要更复杂的解析,还可以先单独解析文件内配置,然后有选择地选择应接管哪些值。例如,禁止在配置文件中指定<em>另一个</em>文件可能是有意义的:</p>
<pre><code>def __call__ (self, parser, namespace, values, option_string=None):
with values as f:
contents = f.read()
data = parser.parse_args(contents.split(), namespace=namespace)
for k, v in vars(data).items():
if v and k != option_string.lstrip('-'):
setattr(namespace, k, v)
</code></pre>
<p>当然,您也可以使文件读取更复杂一些,例如首先从JSON读取。</p>