Я прочитал ваш другой, похожий вопрос и нашел решение без какого-либо предварительного импорта.Это (imho) крайне непитоническое и может во что бы то ни стало считаться грязным "хаком".Я настоятельно рекомендую вам рассмотреть мой другой ответ и просто правильно разобраться с импортом.
Ваша проблема возникает из-за того, что вы уничтожаете пространство имен и все, что ему дорого.Когда вы загрязняете пространство имен функциями / методами с одинаковой сигнатурой, Python-интерпретатор абсолютно не может их различить: он разрешается тем, который был впервые импортирован.
Однако, как уже было сказано,это обходной путь: (в настоящее время) нет способа выгрузить модуль python, но вы можете reload
его использовать, используя модуль imp
.По сути, это позволяет вам очистить (переопределить) пространство имен.Полный рабочий пример можно найти на моем repl.it
# root_folder/main.py
import sys
import imp
from importlib import import_module
def import_script(mod_dir, script):
sys.path.append(mod_dir)
mod = imp.reload(import_module(script, 'Script'))
sys.path.remove(mod_dir)
return mod
# input:
mod_dir = "A"
script = "b"
# import module/script.py
active_mod = import_script(mod_dir, script)
# use module/script.py
mod_name = active_mod.get_mod_name()
print(mod_name) # Prints "A : b.y"
# New input: different module/script.py
mod_dir = "C"
script = "b"
# import module/script.py
active_mod = import_script(mod_dir, script)
# use module/script.py
mod_name = active_mod.get_mod_name()
print(mod_name) # Prints "C : b.y"
, когда модули выглядят как показано ниже:
# root_folder/A/b.py
def get_mod_name():
return "A : b.py"
Обратите внимание, что каждый импортв два раза, поскольку каждый раз, когда вы импортируете модуль (возможно, с дублированным именем), его также необходимо перезагружать для очистки пространства имен.Недостаточно просто del
модуля.