Python:动态导入模块内容

时间:2010-10-05 15:27:02

标签: python import

我有很多

from myproject.settings import param1
from myproject.settings import ...

遍布我的项目。

启动时,我想根据env var加载不同的“设置”模块(例如export SETTINGS=myproject.settings2)

我试图加入myproject.__init__.py 喜欢

module_name =  os.environ['SETTINGS']
m=__import__(module_name)
settings = m

但它不起作用。

from myproject.settings import *
ImportError: No module named settings

如何实现这一目标?

4 个答案:

答案 0 :(得分:1)

尝试使用伪造'fromlist'参数。

mymodule = __import__(mod, fromlist=['a'])

之前在类似你的情况下,它对我有用。

答案 1 :(得分:0)

settings = __import__(os.environ['SETTINGS'])
  

但它不起作用。

为什么呢?你的方法是正确的。例如,Django以同样的方式做到这一点。

答案 2 :(得分:0)

您可以尝试将myproject.settings的绝对路径添加到PYTHONPATH,如下所示:

PYTHONPATH=$PYTHONPATH:$HOME/myproject/settings/ export PYTHONPATH

现在你可以将它保存在〜/ .bashrc中(假设UNIX env)。这样,无论何时打开新终端,此路径都会添加到PYTHONPATH。即python解释器会将此路径添加到它中,就像导入模块时要查找的路径一样。

现在无论您输入的是哪个路径,只需输入import settings&由于myproject/settings存在,python将加载设置文件。

希望这会有所帮助......

答案 3 :(得分:0)

我尝试了下面的代码,并且有效。

这是我的文件夹结构:

src/
 app.py
 settings/
   __init__.py
   production.py
   sandbox.py

settings.__init__.py中,我写道:

import os    
settings_module = os.environ.get('APP_SETTINGS')
if not settings_module:
    from .sandbox import *
else:
    exec('from {} import *'.format(settings_module))

如果未设置var env,则导入沙箱模块。如果已设置,则动态导入模块。

希望这会有所帮助