[英]Python: How to load a module twice?
有没有办法在同一个 python session 中加载一个模块两次?
用一个例子来回答这个问题:这是一个模块:
模组.py
x = 0
现在我想将该模块导入两次,例如创建 class 的两个实例以实际具有x
的两个副本。
已经回答了评论中的问题,“如果他们可以创建一个以x
作为变量的 class,为什么有人愿意这样做”:
您是对的,但是存在必须重写的大量源代码,并且两次加载模块将是一个快速修复^^。
是的,您可以加载一个模块两次:
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__
属性——如果需要这些,只需添加代码来设置它们。)
从 sys.modules 中删除一个条目不一定有效(例如,如果您想在同一个应用程序中使用多个循环帐户等,它会在重复导入两次时失败)
实现此目的的另一种方法是:
>>> import importlib
>>> spec = importlib.util.find_spec(module_name)
>>> instance_one = importlib.util.module_from_spec(spec)
>>> instance_two = importlib.util.module_from_spec(spec)
>>> instance_one == instance_two
False
您可以使用__import__
function。
module1 = __import__("module")
module2 = __import__("module")
编辑:事实证明,这不会导入模块的两个单独版本,而是module1
和module2
将指向同一个 object,正如 Sven 所指出的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.