Задача
Я считаю, что процесс импорта Python великолепен в одном контексте, но часто полностью завершается неудачей в другом. У меня есть ситуация, когда я создаю программу, которую можно запустить как модуль или установить. Работает в одном направлении (как модуль), а не в другом (установлено). Все сводится к тому, как я импортирую. Чего я не знаю, так это как это исправить.
Примечание. Эта программа будет работать только на Python 3.
Пример задачи
Вот код репо, который показывает проблему: https://github.com/jeffnyman/pacumen
Если вы клонируете это, вы можете запустить следующее в корне проекта:
python3 -m pacumen
И это прекрасно работает.
Теперь, однако, я хочу установить его. Итак из корня проекта:
pip3 install .
Это работает (через мой setup.py ), но тогда вы сможете запустить программу следующим образом:
pacumen
Программа запускается, но я получаю эту ошибку:
Traceback (most recent call last):
File "/usr/local/bin/pacumen", line 7, in <module>
from pacumen.__main__ import main
File "/usr/local/lib/python3.7/site-packages/pacumen/__main__.py", line 5, in <module>
from .mechanics import layout
ModuleNotFoundError: No module named 'pacumen.mechanics'
Это явно из-за моего оператора импорта .
Но не ясно, что я могу сделать, чтобы это исправить. Я считаю, что большая часть документации по Python исключительно бесполезна при решении проблем импорта, потому что то, что она говорит мне, работает в одном контексте, но не в другом. Я, несомненно, что-то упустил.
Что я пробовал
Я попытался добавить следующую строку в мой __init__.py
:
from .__main__ import *
Это было из других комментариев по другим вопросам. Это, однако, не работает. Та же ошибка генерируется.
Я попытался изменить свой импорт в __main__.py
, чтобы он был таким:
from pacumen.mechanics import layout
Это было также предложение из другого вопроса. Это тоже не работает. Та же ошибка.
Мой импорт не может быть категорически неправильным, потому что он работает во время работы в качестве модуля. Поэтому я не уверен, что мои настройки выполняются неточно или мне нужно что-то еще в __init__.py
, или то, что я пытаюсь сделать, на самом деле не то, что вы должны делать.