Установленный скрипт Python не может импортировать модули пакета

Я создал пакет Python со следующей структурой каталогов:

/ LICENSE MANIFEST.IN README.rst VERSION docs/ multitool/ __init__.py core/ __init__.py classes.py utils.py libs/ multitool.py tests/ tools/ __init__.py hashtool.py webtool.py setup.py 

Целью является создание приложения командной строки (multitool.py), которое могут добавить третьи стороны, добавив свои собственные файлы в каталог инструментов. Это достигается тем, что они создают подкласс класса, который я создал. Например, это первые несколько строк hashtool.py:

 import multitool class HashTool(multitool.core.classes.CLITool): 

Все это работает, пока я запускаю его из самого каталога проекта:

 $ ./multitool.py -h <---works $ ./multitool/multitool.py -h <---works 

Проблема возникает, когда я пытаюсь создать и установить ее в виде пакета. Установка запускает и устанавливает сценарий. Однако при запуске скрипта он не может найти ни одного из модулей в пакете:

 $ multitool.py import core ImportError: No module named core 

Я попытался изменить импорт на multitool, multitool.core, .multitool, ..multitool и другие с тем же результатом.

Тем не менее, я могу делать импорт из интерпретатора Python:

 Type "help", "copyright", "credits" or "license" for more information. >>> import multitool >>> import multitool.core >>> import multitool.core.classes >>> from multitool import core >>> 

Вот соответствующая часть моего setup.py

 setup( name = 'multitool', version = __version__, license = 'GPLv2', packages = find_packages(exclude=['test/']), scripts = ['multitool/multitool.py'], include_package_data = True, .... ) 

Что я делаю не так? Как я могу импортировать свой собственный код и файлы из каталога инструментов в сценарий, который я устанавливаю вместе с пакетом?

Обновленный отредактированный комментарий MrAlias ​​ниже работал. Путаница заключалась в том, что сценарий был тем же именем, что и сам пакет, и не был в отдельной папке. Перемещение сценария в его собственный каталог bin / разрешило проблему.

2 Solutions collect form web for “Установленный скрипт Python не может импортировать модули пакета”

Во-первых, когда вы устанавливаете пакет, вы импортируете ядро, не указав, что он отличается от пакета с несколькими компонентами. Так:

 import core 

должно быть,

 from multitool import core 

Таким образом, интерпретатор знает модуль для импорта ядра.

[Редактировать]

Что касается структуры каталогов установленного пакета, скрипты должны перейти в отдельный каталог из самого модуля. То, как показана структура каталогов Distutils, установит сценарий, который вы назвали, и в том месте, где ваша система ищет исполняемые файлы, так и в самом пакете, что, вероятно, связано с путаницей.

 import multitool class HashTool(multitool.core.classes.CLITool): 

Импорт пакета не импортирует его подпакеты и подмодули. Попробуй это:

 import multitool.core.classes class HashTool(multitool.core.classes.CLITool): 
  • setup.py: ограничить допустимую версию интерпретатора python
  • Python 3: ImportError «Нет модуля с именем Setuptools»
  • добавлять файлы данных в проекты python setup.py
  • Удаление python setup.py
  • Как указать зависимости при создании файла setup.py для пакета python
  • Как создать колесо Pure-Python
  • расширение python c, проблемы с dlopen на mac os
  • Пакет только бинарные скомпилированные .so файлы библиотеки python, скомпилированные с Cython
  • Ссылаясь на существующие опции distutils внутри setup.cfg и setup.py
  • Использование дополнительного URL-адреса пакета python с параметром setup.py
  • Обнаружение пути установки пакета python из setup.py
  • Python - лучший язык программирования в мире.