如何在Python中动态导入模块

13 浏览
0 Comments

如何在Python中动态导入模块

我试图根据文件名来导入文件,例如:\n

project /
    __init__.py
    log.py
    conf /
        __init__.py
        logger_settings.py
        other_settings.py

\n我想在conf/__init__.py文件中实现类似以下的功能:\n

 # -*- coding: utf-8 -*-                                                         
 # vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab                           
 import os                                                                       
 import sys                                                                         
 import json                                                                        
 def get_settings(identity):                                                             
     """Settings."""                                                                
     try:                                                                       
         from i import *                                                        
     except ImportError as exc:                                                 
         raise Exception('导入配置时出错:%s' % exc) 

\n然后在log.py文件中,我可以像这样做:\n

 #!/usr/bin/env python -u                                                        
 # -*- coding: utf-8 -*-                                                         
 # vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab                           
 import os                                                                       
 import logging                                                                  
 from project import conf                                                     
 CONF = conf.get_settings('logger_settings')                                              
 def getLogger(identity ,log_file=CONF.log_file):  
     # 然后访问CONF返回设置
     # 例如:
     # host = CONF.host 会返回类似'localhost'的内容

\n我想要logger_settings.py的内容如下:\n

log_file = '/mnt/logs/'
host = 'localhost'

\n我需要如何修改conf/__init__.py以实现这个目标?

0
0 Comments

Python中动态导入模块的问题由于需要根据运行时的值来给出模块的名称而出现。解决这个问题的方法是使用内置的__import__函数和importlib模块。

__import__函数是Python的低级别的动态导入模块的方法。它接受一个字符串参数作为模块的名称,并返回导入的模块对象。下面是一个使用__import__函数动态导入模块的例子:

import importlib
settings = importlib.import_module('conf.%s' % i)

上述代码中,'conf.%s' % i是一个根据运行时值动态生成的模块名称,importlib.import_module函数会根据该名称导入对应的模块,并将导入的模块对象赋值给settings变量。

除了__import__函数,还可以使用importlib模块来实现动态导入模块。importlib模块提供了更高级别的接口来处理模块的导入。通过调用importlib.import_module函数并传入模块的名称,可以实现动态导入模块。

需要注意的是,使用动态导入模块时,需要确保提供的模块名称是正确的,并且模块存在。否则,会导致导入失败的异常。

更多关于动态导入模块的详细信息可以查看Python官方文档的以下链接:

- http://docs.python.org/dev/library/importlib.html

- http://docs.python.org/2/library/functions.html

0