我试图动态加载我创建模块。

现在这个工作正常:

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top