Python之动态加载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iyeahme/article/details/53135870

在开发中经常总会生产环境与开发环境系统参数不同的问题,为此很多时候都要使用inijsonxml等配置文件。这是很多情况下的常用做法。然而作为一名有情怀的挖坑工人和Python使用者,怎么能甘心用这种办法 : ).
之前见过某个Python攻城狮在本地创建一个config_local.py文件,然后在config.py模块使用如下代码覆盖其中的配置:

from os import path

if path.exists(BASE_PATH,'config_local.py'):
    from config_local import *

第一次见到这种写法不禁赞叹果然是”Python * * * “,可是不久后就发现了这种方法的弊端————作为一个重度PyCharm依赖和努力消除所有红线和黄线的强迫症患者,IDE里的提示根本不能忍好吧!于是就研究(其实就是Google了一下)Python模块的动态加载.终于找到了importlib这个包.

使用importlib.import_module()函:数可以导入名字为字符串给出的一个模块或者包的一部分:

使用importlib导入模块

下面进入正题,动态加载配置模块:

  • 动态加载配置文件函数:
from os import path
import importlib

def load_config(env, module_name):
    """
    动态加载配置
    :param env:配置模块globals
    :param module_name:模块名
    """
    # 检测该模块是否存在
    module_file = "%s.py" % path.join(*module_name.split("."))
    assert path.exists(module_file)
    module = importlib.import_module(module_name)
    m_dict = getattr(module, "__dict__")
    for key in m_dict:
        # 过滤_开头的属性
        if key.startswith("_"):
            continue
        env[key] = m_dict[key]
  • 创建config.py模块:
"""
应用配置文件
"""

__all__ = ["DB_CONFIG"]
DB_CONFIG = {
    "host": "192.168.1.254",
    "port": 3306,
    "user": "root",
    "passwd": "******"
}

_PRIVATE_VALUE = 'private <config.py>'
  • 创建config_local.py模块:
"""
本地配置文件
"""
DB_CONFIG = {
    "host": "127.0.0.1",
    "port": 3306,
    "user": "admin",
    "passwd": "******"
}

_PRIVATE_VALUE = 'private <config_config.py>'

下面看看结果:
结果截图

author:粗鄙之语

阅读更多

没有更多推荐了,返回首页