有没有办法在同一个python会话中加载模块两次?
用一个例子填写这个问题:这是一个模块:
Mod.py
x = 0
现在我想导入该模块两次,比如创建一个类的两个实例,实际上有两个x
副本。
要回答评论中的问题,“为什么有人会想要这样做,如果他们可以创建一个x
作为变量的类”:
你是对的,但是存在一些必须重写的大量源代码,并且加载模块两次将是一个快速修复^^。
答案 0 :(得分:17)
是的,您可以加载模块两次:
import mod
import sys
del sys.modules["mod"]
import mod as mod2
现在,mod
和mod2
是同一模块的两个实例。
那就是说,我怀疑这是否有用。而是使用类 - 最终它将减少工作量。
编辑:在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")
编辑:事实证明,这不会导入模块的两个单独版本,而是module1
和module2
将指向同一个对象,正如Sven所指出的那样。