如何在Python中动态导入模块

How to dynamically import a module in Python

本问题已经有最佳答案,请猛点这里访问。

我正在尝试根据文件名导入文件,例如:

1
2
3
4
5
6
7
project /
    __init__.py
    log.py
    conf /
        __init__.py
        logger_settings.py
        other_settings.py

在我的conf/__init__.py文件中,我想要类似的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 # -*- 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('Eror importing config %s' % exc)

因此,比起在log.py文件中,我可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 #!/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):  
     # Then access CONF to return settings
     # For example:
     # host = CONF.host  would return something like 'localhost'

我想让logger_settings.py像这样:

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

为了实现这一点,我需要如何修改conf/__init__.py


__import__内置(低电平)和importlib高电平。

它们提供了一种动态导入模块的方法(即,其名称由运行时值给出)。

1
2
import importlib
settings = importlib.import_module('conf.%s' % i)
  • http://docs.python.org/dev/library/importlib.html
  • http://docs.python.org/2/library/functions.html网站