繁体   English   中英

Python:如何加载一个模块两次?

[英]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

现在, 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__属性——如果需要这些,只需添加代码来设置它们。)

从 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")

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM