Если я введу import A
из каталога, содержащего A.py
и A.so
, файл .so
будет импортирован. Я заинтересован в изменении порядка типов файлов импорта, чтобы .py
имел приоритет над .so
, но только временно, то есть между строкой кода i
и j
. Конечно, это может быть достигнуто с помощью some importlib
magi c?
В настоящее время я решаю проблему, копируя .py
в отдельный каталог, добавив в этот каталог sys.path
и , затем выполните импорт, что просто ужасно.
Зачем это нужно?
Файл (ы) .so
- это cython -компилированные версии файлов .py
. Я делаю некоторые пользовательские преобразования кода поверх Cython, для чего мне нужно импортировать исходный код .py
, даже если присутствует «эквивалент» .so
.
Тестовая настройка
Далее следуют простые настройки теста.
# A.py
import B
# B.py
import C
print('hello from B')
# C.py
pass
Запуск python A.py
успешно распечатывает сообщение из B.py
. Теперь добавьте B.so
(так как содержимое файлов .so
не имеет значения, хорошо иметь текстовый файл B.so
- это нормально):
# B.so
this is a fake binary
Теперь python A.py
не удается. Хотя importlib
- это современный способ работы, я пока знаю, как импортировать указанный файл c напрямую, используя устаревший модуль imp
. Обновление A.py
до
# A.py
import imp
B = imp.load_source('B', 'B.py')
заставляет его работать снова. Тем не менее, введение C.so
ломает его снова, так как поиск для .py
вместо .so
не зарегистрирован глобально в механизме импорта:
# C.so
this is a fake binary
Обратите внимание, что в этом примере я только разрешено редактировать A.py
. Мне нужно решение для Python 3.8, но я подозреваю, что любое решение для 3.x также работает на 3.8.