Python: как загрузить модуль дважды? - PullRequest
8 голосов
/ 28 июня 2011

Есть ли способ загрузить модуль дважды в одном сеансе Python?
Чтобы заполнить этот вопрос примером: Вот модуль:

Mod.py

x = 0

Теперь я хотел бы импортировать этот модуль дважды, например, создать два экземпляра класса, чтобы фактически иметь две копии x.

Чтобы уже отвечать на вопросы в комментариях, «почему кто-то захочетсделайте это, если бы они могли просто создать класс с x в качестве переменной ":
Вы правы, но существует огромное количество исходного кода, которое нужно было бы переписать, и загрузка модуля дважды была бы быстрым решением.^^.

Ответы [ 3 ]

17 голосов
/ 28 июня 2011

Да, вы можете загрузить модуль дважды:

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__ - если они необходимы, просто добавьте код для их установки.)

0 голосов
/ 29 апреля 2019

Удаление записи из 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
0 голосов
/ 28 июня 2011

Вы можете использовать функцию __import__.

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

Редактировать: Оказывается, это не импортирует две отдельные версии модуля, вместо этого module1 и module2 будут указывать на один и тот же объект, как указал Свен.

...