这是我参与2022首次更文挑战的第31天,活动详情查看2022首次更文挑战
日常场景中,总会出现需要重载模块的情况,为了实现重载模块这一功能,下面介绍了几种方法可以任你选择
在python2中,可以在__init__.py中使用reload()的方法重载模块,具体使用如下:
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> reload(bar)
successful to be imported
<module 'foo.bar' from 'foo/bar.pyc'>
python3中,你可以使用importlib.reload的方法,具体使用如下:
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import importlib
>>> importlib.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
如果你的python3版本小于3.3 还可以使用imp.reload方法,具体使用如下:
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import imp
>>> imp.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
当然我们也可以反其道而行之,既然之前都是重新导入,我们当然可以从已导入的包中移除他们,具体使用如下:
>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> sys.modules['foo.bar']
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
>>> del sys.modules['foo.bar']
>>>
>>> import foo.bar
successful to be imported
另外,这里介绍一个坑,在这个例子使用的是 import foo.bar 而不是想前面这种from foo import bar,原因是 如果你使用from foo import bar来移除 sys.modules 来从而重载模块是没有办法做到的。
上面说了重载模块,下面我们来说说重载配置文件,很多地方可能需要修改的配置文件动态的去加载,这个时候就可以使用oslo_config
oslo_config 也可以提供reload的功能。 oslo_config 中cfg.py的源码
@__clear_cache
@__clear_drivers_cache
def reload_config_files(self):
"""Reload configure files and parse all options
:return: False if reload configure files failed or else return True
"""
try:
namespace = self._reload_config_files()
except SystemExit as exc:
LOG.warning("Caught SystemExit while reloading configure "
"files with exit code: %d", exc.code)
return False
except Error as err:
LOG.warning("Caught Error while reloading configure files: "
"%s", err)
return False
else:
self._namespace = namespace
return True
使用方法: 可以直接调用reload_config_files()方法
from oslo_config import cfg
CONF = cfg.CONF
CONF.reload_config_files()