Как импортировать из модуля в тот же каталог?

1

Я пытаюсь создать пакет 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'

  • 0
    удалить начальный "." из вашего импорта
  • 0
    Хм, я сделал это и теперь получаю следующую ошибку: из cache.default import DefaultCache ModuleNotFoundError: Нет модуля с именем «cache». Также я обновил исходный вопрос, включив в него информацию о том, как я тестирую.
Показать ещё 8 комментариев
Теги:
python-3.x
python-import

1 ответ

2
Лучший ответ

Из вашей трассы:

  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 узлах.

  • 0
    Ах, вы правы, я скопировал не ту трассировку. Это был тот, где я пробовал другой путь импорта. Это обновлено. Похоже, проблема заключалась в том, что, поскольку project вложен ( /project/project ), а test.py находится в том же каталоге, что и внешний каталог project , он выглядел в другом месте, чем я предполагал. Большое спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню