Python的模块的动态加载
题
我试图动态加载我创建模块。
现在这个工作正常:
import structures.index
但是,如果我通过动态地将其导入尝试同样的事情,它失败。
struct = __import__("structures.index")
提供的错误是:
Error ('No module named structures.index',)
任何想法,为什么?
编辑:当使用全部范围(它排序的作品?):
struct = __import__("neoform.structures.index")
这不会引发任何错误,但是,它没有加载索引模块,它的加载“neoform”模块来代替。
“结构” 的结果是:
<module 'neoform' from '/neoform/__init__.py'>
另外,作为侧问题,我怎样才能然后动态加载模块内实例化一个类? (假设所有的模块包含共同的类名)。
编辑:解:(感谢coonj和里克)该结束了是什么工作。不知道为什么(还),但fromlist
必须是什么“什么明显的,因为它工作时,我把字母‘A’为(假设该文件只有在这1级怪)的值。
def get_struct_module(self, name):
try:
return = __import__("neoform.structures." + name, fromlist='*')
except ImportError, e:
self.out.add("Could not load struct: neoform.structure." + name + "\n\n" + "Error " + str(e.args))
解决方案
我不知道什么是“失败”的意思,所以我就提到__import__('structures.index')
应该,事实上,工作,但它不会在当前范围内指定模块名称。要做到这一点(再使用动态导入模块中的类),你将不得不使用:
structures = __import__('structures.index')
structures.index.SomeClass(...)
上__import__
的完整细节,请此处。
修改:(基于问题编辑)强>
要导入neoform.structures.index
,并返回index
模块,你会做以下内容:
structures = __import__('neoform.structures.index',
fromlist=['does not in fact matter what goes here!'])
所以,如果你有包名packages
的列表,你可以导入自己的index
模块和使用下面的代码实例化一些MyClass
类每个:
modules = [ __import__('neoform.%s.index' % pkg, fromlist=['a'])
for pkg in packages ]
objects = [ m.MyClass() for m in modules ]
其他提示
要导入的子模块时,需要在fromlist
结果的__import__()
ARG指定它们佛例如,相当于:
import structures.index
是:
structures = __import__('structures', fromlist=['index'])
要在地图中做到这一点是一个小更棘手...
import mod1.index
import mod2.index
import mod3.index
对于那些进口的,你要定义一个新的功能,以获得从每个模块index
子模块:
def getIndexMods(mod_names):
mod_list = map(lambda x: __import__(x, fromlist='index'))
index_mods = [mod.index for mod in mod_list]
return index_mods
现在,你可以做到这一点去的所有索引模块引用:
index_mods = getIndexMods(['mod1', 'mod2', 'mod3'])
另外,如果你想抓住未命名的“索引”子模块,那么你可以这样做:
mod1, mod2, mod3 = map(lambda x,y: __import__(x, fromlist=y),
['mod1', 'mod2', 'mod3'], ['index1', 'index2', 'index3'])
使用全部范围( “neoform.structures.index”)与该辅助方法。
def import_module(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
module = import_module("neoform.structures.index")
# do stuff with module
下面的Java程序员,但我认为你需要的小鬼模块
>>> import imp
>>> fm = imp.find_module('index', ['./structures']) # for submodule
>>> mymod = imp.load_module('structures.index', *fm)
>>> mymod
<module 'structures.index' from './structures/index.pyc'>
>>> x = mymod.insideIndex()
Initialising index class...
瞧!
为什么地球上,你将取代
import structures.index
与
map(__import__, ["structures.index"])
在第一个(A)的工作原理,(b)中的是动态和(c)直接支撑。对于更复杂的东西代替易于变化,纯文本源有什么可能的使用情况是存在的?
在短:不这样做。它不具有任何值。
修改强>
在“我从数据库中获取进口”是一个崇高的努力,但还是不懂事。什么样的代码块取决于这些进口?这整个代码块 - 进口和所有的 - 是要执行什么。这整个代码块 - 进口,语句和一切 - 。应该是一个普通的旧蟒模块文件
从文件系统导入的代码块。使用数据库来识别文件,该文件的作者 - 要使用数据库什么。但是简单地导入并执行该模块的最简单的可能方式。
真的晚了张贴在这里。但是我正在寻找对谷歌这个问题。我做了一些试验和错误。不知道这片段将帮助,但在这里。使用它的瓶的网站。
modules = ['frontend', 'admin']
for module in modules:
mod = __init__('controllers.%s' % module, fromlist=[module])
app.register_blueprint(mod.blueprint_mod)
# or
from importlib import import_module
modules = ['frontend', 'admin']
for module in modules:
mod = import_module('controllers.%s' % module)
app.regitster_blueprint(mod.blueprint_mod)