Python:如何两次加载一个模块?
有没有办法在同一个Python会话中加载一个模块两次呢?
为了更好地理解这个问题,下面给出一个例子:这是一个模块:
Mod.py
x = 0
现在我想要导入这个模块两次,就像创建一个类的两个实例一样,这样我就能有两个不同的x
的副本。
为了提前回答评论中的问题,“为什么有人想这样做,如果他们可以创建一个类,把x
作为变量”:
你说得对,但有很多现有的代码需要重写,而两次加载模块会是一个快速的解决办法^^。
3 个回答
-1
你可以使用 __import__
这个函数。
module1 = __import__("module")
module2 = __import__("module")
补充说明:实际上,这并不会导入两个不同版本的模块,module1
和 module2
会指向同一个对象,正如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
现在,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__
属性——如果需要这些,可以加上代码来设置它们。)