Python:如何加载模块两次?

时间:2011-06-28 14:15:34

标签: python module load

有没有办法在同一个python会话中加载模块两次?
用一个例子填写这个问题:这是一个模块:

Mod.py

x = 0

现在我想导入该模块两次,比如创建一个类的两个实例,实际上有两个x副本。

要回答评论中的问题,“为什么有人会想要这样做,如果他们可以创建一个x作为变量的类”: 你是对的,但是存在一些必须重写的大量源代码,并且加载模块两次将是一个快速修复^^。

3 个答案:

答案 0 :(得分:17)

是的,您可以加载模块两次:

import mod
import sys
del sys.modules["mod"]
import mod as mod2

现在,modmod2是同一模块的两个实例。

那就是说,我怀疑这是否有用。而是使用类 - 最终它将减少工作量。

编辑:在Python 2.x中,您还可以使用以下代码“手动”导入模块:

import imp

def my_import(name):
    file, pathname, description = imp.find_module(name)
    code = compile(file.read(), pathname, "exec", dont_inherit=True)
    file.close()
    module = imp.new_module(name)
    exec code in module.__dict__
    return module

此解决方案可能比第一个更灵活。您不再需要“打击”导入机制,因为您(部分)滚动自己的导入机制。 (请注意,此实现不会设置模块的__file____path____package__属性 - 如果需要这些属性,只需添加代码即可设置它们。)

答案 1 :(得分:0)

从sys.modules中删除条目不一定有效(例如,如果要在同一个应用中使用多个递归帐户,则两次递归导入都会失败)

另一种实现此目的的方法是:

Collections.sort(list)

答案 2 :(得分:-1)

您可以使用__import__功能。

module1 = __import__("module")
module2 = __import__("module")

编辑:事实证明,这不会导入模块的两个单独版本,而是module1module2将指向同一个对象,正如Sven所指出的那样。