Как импортировать из модуля в тот же каталог? - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь создать пакет Python3.6, но у меня возникли ошибки ModuleNotFound при импорте из пакета. Пакет имеет следующую структуру:

project/
    project/
        cache/
            default.py
            interface.py
        __init__.py
        handler.py
test.py

Файл __init__.py содержит следующее:

from .handler import Handler

def getHandler(access_token=None, **kwargs):
    return Handler(access_token, **kwargs)

А затем в handler.py я пытаюсь импортировать из cache со следующим:

from .cache.default import DefaultCache

Цель состоит в том, чтобы разрешить следующее по коду клиента:

import project

handler = project.getHandler()

Последний импорт не удался, и я не понимаю, почему. Есть идеи? ТИА.

Не уверен, насколько это актуально, но я проверяю это, выполняя следующее во внешней директории project:

> pip install .
> python3 ../test.py

Возвращает следующую трассировку (venv) Jamess-MacBook-Pro-2:project james$ python3 ../test.py Traceback (most recent call last): File "../test.py", line 1, in <module> import project File "/Users/james/Work/Project/project/venv/lib/python3.6/site-packages/project/__init__.py", line 1, in <module> from .handler import Handler File "/Users/james/Work/Project/project/venv/lib/python3.6/site-packages/project/handler.py", line 7, in <module> from .cache.default import DefaultCache ModuleNotFoundError: No module named 'project.cache'

1 Ответ

0 голосов
/ 31 августа 2018

Из вашего следа:

  File "/Users/james/Work/Project/project/venv/lib/python3.6/site-packages/project/handler.py", line 7, in <module>
    from cache.default import DefaultCache

Это не то же самое, что код, который вы показали нам здесь:

from .cache.default import DefaultCache

.cache.default является правильным - это относительный путь из project, поэтому он найдет project.cache.default в project/cache/default.py.

cache.default без ведущей точки в вашем фактическом коде - это абсолютный путь от любой из директорий в sys.path. Поскольку ни в одном из этих каталогов нет файла или каталога с именем cache, произойдет сбой.


Между тем, структура вашего проекта не похожа на ту, которую вы нам показали. В противном случае import project не должен найти установленную версию. По умолчанию (и я не думаю, что вы что-то сделали для его изменения), первая запись в sys.path «это каталог, содержащий скрипт, который использовался для вызова интерпретатора Python». Что, учитывая структуру, которую вы разместили здесь, означает, что import project должен найти подкаталог project в том же каталоге, что и test.py, а не в каталоге site-packages.

вашего venv.
...