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

8 投票
3 回答
7190 浏览
提问于 2025-04-16 20:27

有没有办法在同一个Python会话中加载一个模块两次呢?
为了更好地理解这个问题,下面给出一个例子:这是一个模块:

Mod.py

x = 0

现在我想要导入这个模块两次,就像创建一个类的两个实例一样,这样我就能有两个不同的x的副本。

为了提前回答评论中的问题,“为什么有人想这样做,如果他们可以创建一个类,把x作为变量”:
你说得对,但有很多现有的代码需要重写,而两次加载模块会是一个快速的解决办法^^。

3 个回答

-1

你可以使用 __import__ 这个函数。

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

补充说明:实际上,这并不会导入两个不同版本的模块,module1module2 会指向同一个对象,正如Sven所指出的那样。

4

从 sys.modules 中删除一个条目并不一定有效(比如,如果你想在同一个应用中使用多个 recurly 账户,第二次导入 recurly 时就会失败)。

还有另一种方法可以实现这个目标:

>>> 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
19

是的,你可以把一个模块加载两次:

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

撰写回答