Python模块的动态加载
我正在尝试动态加载我创建的模块。
现在这工作正常:
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 和 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))
I'm trying to dynamically load modules I've created.
Right now this works properly:
import structures.index
But if I try the same thing by importing it dynamically, it fails.
struct = __import__("structures.index")
Error supplied is:
Error ('No module named structures.index',)
Any ideas why?
Edit: When using full scope (it sort of works?):
struct = __import__("neoform.structures.index")
This doesn't throw any errors, however, it isn't loading the index module, it's loading the "neoform" module instead.
The result of "struct" is:
<module 'neoform' from '/neoform/__init__.py'>
Also, as a side question, how can I then instantiate a class within a dynamically loaded module? (assuming all the modules contain a common class name).
Edit: Solution: (thanks coonj & Rick) This ended up being what worked. Not sure why (yet), but the fromlist
had to be something "anything apparently, since it worked when I put the letter "a" as a value (strange, given that the file only had 1 class in it).
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))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我不确定“失败”是什么意思,所以我只是提到
__import__('structurals.index')
事实上应该可以工作,但它不会分配模块名称在当前范围内。 为此(然后在动态导入的模块中使用类),您必须使用:有关
__import__
的完整详细信息可在此处。编辑:(基于问题编辑)
要导入
neoform.structurals.index
并返回index
模块,您将执行以下操作:如果您有包名称
packages
列表,则可以导入它们的index
模块,并使用以下代码为每个模块实例化一些MyClass
类:I'm not sure what "it fails" means, so I'll just mention that
__import__('structures.index')
should, in fact, work, but it doesn't assign the module name in the current scope. To do that (and then use a class in the dynamically imported module), you'll have to use:The complete details on
__import__
are available here.Edit: (based on question edit)
To import
neoform.structures.index
, and return theindex
module, you would do the following:So if you have a list of package names
packages
, you can import theirindex
modules and instantiate someMyClass
class for each using the following code:要导入子模块,您需要在
__import__()
的fromlist
arg 中指定它们Fo 示例,相当于:
是:
To do this in a map 有点棘手......
对于这些导入,您需要定义一个新函数来从每个模块获取
index
子模块:现在,您可以这样做来获取对所有模块的引用索引模块:
另外,如果您想获取未命名为“index”的子模块,那么您可以这样做:
To import sub-modules, you need to specify them in the
fromlist
arg of__import__()
Fo example, the equivalent of:
is:
To do this in a map is a little more tricky...
For those imports, you would want to define a new function to get the
index
sub-module from each module:Now, you can do this to get references to all index modules:
Also, if you want to grab sub-modules that are not named 'index' then you could do this:
使用此辅助方法的完整范围(“neoform.structs.index”)。
Use full scope ("neoform.structures.index") with this helper method.
瞧!
Voila!
这里是 Java 程序员,但我认为您需要 imp 模块
Java programmer here, but I think you need the imp module
你到底为什么要替换
为
第一个(a)有效,(b)是动态,(c)直接支持。 用更复杂的东西替换易于更改的纯文本源有什么可能的用例?
简而言之:不要这样做。 它没有任何价值。
编辑
“我从数据库获取导入”是一项崇高的努力,但仍然不明智。 哪些代码块取决于这些导入? 整个代码块——导入和所有——就是您想要执行的。 整个代码块——导入、语句和所有内容——应该是一个普通的旧 python 模块文件。
从文件系统导入该代码块。 使用数据库来识别哪个文件、文件的作者——任何您想要使用数据库的内容。 但只需以最简单的方式导入并执行模块即可。
Why on earth would you replace
with
The first one (a) works, (b) is dynamic and (c) is directly supported. What possible use case is there for replacing easy-to-change, plain-text source with something more complex?
In short: don't do this. It doesn't have any value.
Edit
The "I'm getting the import from a database" is a noble effort, but still not sensible. What code block depends on those imports? That whole code block -- imports and all -- is what you want to execute. That whole code block -- imports, statements and everything -- should be a plain old python module file.
Import that block of code from the file system. Use the database to identify which file, the author of the file -- anything you want to use the database for. But simply import and execute the module the simplest possible way.
这里发帖真的晚了。 但我正在谷歌上搜索这个问题。 我做了一些尝试和错误。 不确定这个片段是否有帮助,但就在这里。 将其用于 Flask 站点。
Really late post here. But I was searching for this question on google. I did some trial and error. Not sure if this snippet will help but here it is. Using it for Flask site.