Я пытаюсь создать пакет 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'
Из вашей трассы:
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
узлах.
project
вложен ( /project/project
), а test.py
находится в том же каталоге, что и внешний каталог project
, он выглядел в другом месте, чем я предполагал. Большое спасибо за помощь!
"."
из вашего импорта