我正在尝试动态加载我创建的模块。
现在这可以正常运作:
import structures.index
但如果我通过动态导入它来尝试同样的事情,它就会失败。
struct = __import__("structures.index")
提供的错误是:
Error ('No module named structures.index',)
任何想法为什么?
编辑:使用全范围时(它有用吗?):
struct = __import__("neoform.structures.index")
这不会抛出任何错误,但是,它没有加载索引模块,而是加载了“neoform”模块。
“struct”的结果是:
<module 'neoform' from '/neoform/__init__.py'>
另外,作为一个附带问题,我如何在动态加载的模块中实例化一个类? (假设所有模块都包含一个公共类名)。
编辑:解决方案:(感谢coonj&amp; Rick)这最终成功了。不确定为什么(还),但是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))
答案 0 :(得分:10)
我不确定“失败”是什么意思,所以我只是提到__import__('structures.index')
实际应该可以工作,但它不会在当前范围内分配模块名称。要做到这一点(然后在动态导入的模块中使用一个类),你将不得不使用:
structures = __import__('structures.index')
structures.index.SomeClass(...)
有关__import__
的完整详情,请here。
编辑:(基于问题编辑)
要导入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 ]
答案 1 :(得分:4)
要导入子模块,您需要在fromlist
的{{1}} arg中指定它们,例如,相当于:
__import__()
是:
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”的子模块,那么您可以这样做:
index_mods = getIndexMods(['mod1', 'mod2', 'mod3'])
答案 2 :(得分:3)
将完整范围(“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
答案 3 :(得分:1)
Java程序员在这里,但我认为你需要imp module
答案 4 :(得分:1)
>>> 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...
瞧!
答案 5 :(得分:0)
为什么要替换
import structures.index
与
map(__import__, ["structures.index"])
第一个(a)有效,(b) 动态,(c)直接支持。有什么可能的用例是用更复杂的东西替换易于更改的纯文本源?
简而言之:不要这样做。它没有任何价值。
修改强>
“我从数据库中导入”是一项崇高的努力,但仍然不明智。什么代码块取决于那些导入?整个代码块 - import和all - 就是你想要执行的。整个代码块 - 导入,语句和所有内容 - 应该是一个普通的旧python模块文件。
从文件系统导入该代码块。使用数据库来标识文件的作者 - 文件的作者 - 您要使用数据库的任何内容。但只需以最简单的方式导入和执行模块。
答案 6 :(得分:0)
这里发帖很晚。但我在谷歌上搜索这个问题。我做了一些试验和错误。不确定这个代码片段是否会有所帮助,但现在就是这样。将它用于Flask网站。
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)