将配置从 .txt 文件传递​​到 argparse? (类似于 youtube-dl 的 `--config-location`)

Passing configs from `.txt` file into argparse? (Similar to youtube-dl's `--config-location`)

我有一个包含 ~20 个配置的程序,我想通过 argparse 从命令行访问它,可以是 --config_1 'This is the first config'--config-location <path_to_config_file>,其中配置文件的路径将是 .txt 形式:

--config_1 'This is the first config'
--config_2 '2nd Config'
--config_3 3
...

目前,我的代码类似于:

parser = argparse.ArgumentParser()
parser.add_argument('--config_1')
args = vars(parser.parse_args())

这种方法的灵感来自 youtube-dl--config-location。如果有更好的方法来完成我正在尝试做的事情,也欢迎提出建议。感谢阅读!

argparse 支持开箱即用的类似功能。

parser = ArgumentParser(fromfile_prefix_chars='@')
parser.parse_args()

现在任何以 @ 开头的参数都将被视为要读取的文件名,每一行都被视为一个单独的参数。这需要您的文件看起来像

--config_1
This is the first config
--config_2
2nd Config
--config_3
3
...

相反。

What youtube-dl does 只是打开文件,读取其内容,然后将其拆分为空格,类似于 shell 的方式。

有那么多命令行选项,更好的方法是制作一个配置文件。有两种方法可以做到这一点:

首先是创建一个单独的 Python 文件。创建一个名为 config.py:

的文件
config_1 = 'This is the first config'
config_2 = '2nd config'
config_3 = 3

然后,在另一个文件中(比如,prog.py):

import config

print(config.config_1)
print(config.config_2)
print(config.config_3)

这将输出:

This is the first config
2nd config
3

第二种方式是对上述方式的改进。您可以使用 ConfigParser。例如,以 config.ini:

为例
[DEFAULT]
config_1 = 'This is the first config'
config_2 = '2nd config'
config_3 = 3

和一个例子prog.py:

import configparser

config = configparser.ConfigParser()
config.read('config.ini')
print(config['DEFAULT']['config_1'])
print(config['DEFAULT']['config_2'])
print(config['DEFAULT']['config_3'])

我们可以得到:

This is the first config
2nd config
3

请参阅 here 了解这两种方法之间的讨论。