Импортировать два модуля с одинаковыми именами в верхней части элементов PYTHONPATH - PullRequest
1 голос
/ 05 ноября 2019

Я сокращу нотацию. У меня есть

PYTHONPATH=/path1/dir1:/path2/dir2

Структуры:

/path1/dir1/
    README
    muggle.py
    ...
    utils/

/path2/dir2/
    __init__.py
    utils/
        __init__.py
        pkg2/
            __init__.py
            mod2.py

dir1 имеет модуль utils, но сам не является пакетом: нет __init__.py
dir2имеет модуль utils, а имеет имеет __init__.py

Мой код котельной плиты (до того, как dir1 был частью среды) имеет импорт из dir2 формы

from utils.pkg2.mod2 import func2

Проблема заключается в том, что я сейчас адаптирую этот код для вызова функций, которые импортируют из utils в dir1;Я не могу изменить эту часть среды.

Что я могу сделать, чтобы мой код пошел на модуль dir2/utils? К сожалению, это также должно быть адаптировано к Python 2.6.6 и более поздним версиям.

У меня есть поиск по существующим вопросам в SO и других местах;все ответы, которые я нашел, зависят от некоторого «дескриптора» пакета, которого у меня нет.

1 Ответ

1 голос
/ 05 ноября 2019

Этот оператор импорта неверен:

from utils.pkg2.mod2 import func2

Если он когда-либо работал правильно, это зависело от разрешения с текущим рабочим каталогом, неявного относительного импорта в Python 2.x или ручного манипулирования PYTHONPATH / sys.path.

Это тип импорта, для которого PEP8 сказал:

Неявный относительный импорт должен использоваться никогда и был удаленв Python 3.

Так что же делать вместо этого? sys.path должен быть дополнен каталогами верхнего уровня, а не каталогами внутри пакета, то есть:

PYTHONPATH=/path1/dir1:/path2

И изменить импорт следующим образом:

from dir2.utils.pkg2.mod2 import func2

Теперь подпункт -package dir2.utils - это пространство имен из пакета верхнего уровня utils.

...