项目开发完成后有一个需求:需要动态修改项目的配置文件。动态是什么意思?你可以认为我们的项目是一直处于运行状态,项目运行依赖某个配置文件,我们的目标是:在不影响项目正常运行的情况下,对配置文件进行修改,且修改后项目使用的是新配置文件。
问题分析保持项目一直运行用 while True
来模拟,我们要解决的问题可以拆分为两个:
- 修改配置文件而不影响项目运行
- 让项目能够加载到新的配置文件
配置文件的格式不同,解决方案不同,在 Python 中比较推荐的配置文件格式是:YAML
和 PY
。
config.yaml
params:
a: 1
b: 2
YAML 配置文件要解决的是文件占用问题。因为项目需要保持运行状态,当修改 YAML 配置文件时,项目加载不到配置文件,进而抛出异常。加载 YAML 配置文件使用如下代码:
import yaml # pip intall yaml
params = yaml.load(open('config.yaml'), Loader=yaml.FullLoader)
深究 yaml.load()
函数的源码可知,当配置文件处于占用状态时,加载不到任何参数,会返回 None
。在 yaml.load()
外套一个 while
循环,当 params
不为 None
时(即配置文件修改完毕)结束循环,即可解决文件占用问题。
app.py
import yaml
while True:
params = None
while params == None:
params = yaml.load(open('config.yaml'), Loader=yaml.FullLoader)
print(params)
PY
config.py
params = {
'params': {
'a': 1,
'b': 2
}
}
PY 配置文件要解决的是重载问题。from config import params
默认是只导入一次,修改 config.py
里面的 params
变量,对于正在运行的 app.py
里面的 params
变量没有任何影响。故,我们每次都需要重新加载 config.py
文件,以监测配置参数的更新,该重载方案使用 importlib.reload
可以实现。
app.py
from importlib import reload
import config
while True:
reload(config)
from config import params
print(params)