#python-3.x #python-import
#python-3.x #python-импорт
Вопрос:
Недавно я наткнулся на некоторый код, в котором используется трюк, который заставляет меня нервничать. Система, на которую я смотрю, имеет Moo.so
файл расширения Python, хранящийся вне пути, и разработчик хочет импортировать его с помощью just import Moo
. По разным причинам ни расположение файла, ни sys.path
может быть изменен, и расширение должно быть загружено в ExtensionFileLoader
любом случае.
Итак, что было сделано, так это иметь a Moo.py
в пути, который загружает модуль расширения, а затем заменяет себя sys.modules
модулем расширения, в следующих строках:
' Moo.py '
from importlib.machinery import ExtensionFileLoader
loader = ExtensionFileLoader('AnotherNameForMoo', '/path/to/Moo.so')
module = loader.load_module()
sys.modules['Moo'] = module
Теперь это действительно работает. (У меня есть несколько довольно подробных тестов в этом репозитории, если вы хотите взглянуть.) Похоже, что, по крайней мере, в CPython с 3.4 по 3.7, import Moo
не привязывается к Moo
модулю, который он загрузил и вставил sys.modules['Moo']
, а вместо этого привязывает текущее значение sys.modules['Moo']
после возврата скрипта верхнего уровня модуля, независимо от того, было ли это то, что он изначально туда вставил.
Я не могу найти ничего ни в одной документации Python, что указывало бы, что это требуемое поведение, а не просто случайность реализации.
Насколько это безопасно? Каковы другие способы, которыми можно было бы попытаться достичь аналогичного эффекта «начальной загрузки»?