Как написать операторы импорта Python 3 при запуске в качестве модуля и установленной программы? - PullRequest
0 голосов
/ 08 января 2019

Задача

Я считаю, что процесс импорта 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, или то, что я пытаюсь сделать, на самом деле не то, что вы должны делать.

1 Ответ

0 голосов
/ 08 января 2019

Ну, конечно, я думаю, что нашел свой ответ после публикации выше. Я не уверен, что это правильно, но, похоже, это сработает, поэтому я запишу это как ответ на случай, если кто-то еще столкнется с этим вопросом.

Что мне нужно было сделать, это добавить следующее в мой setup.py:

packages=['pacumen', 'pacumen.mechanics'],

Раньше у меня было только это:

packages=['pacumen'],

Мне, безусловно, придется делать это для каждого каталога, который я создаю.

...