У меня есть небольшой pip-пакет (назовем его my_package), который я написал в python3 со следующей структурой каталогов.Меня смущает несоответствие, которое я вижу при запуске my_package.py
локально по сравнению с тем, когда я тестирую его, загружая его из PyPI, импортируя в какой-то другой код, а затем запускаю.
.
| README.md
| LICENSE
| setup.py
| build
| dist
| my_package
| -- __init__.py
| -- my_package.py
| -- helpers
| ---- __init__.py
| ---- helper1.py
| ---- helper2.py
| ---- helper3.py
| ---- helper4.py
В my_package.py
У меня есть следующий импорт:
from helpers import helper1
from helpers import helper2
from helpers import helper3
from helpers import helper4
Очевидно, что это просто имена наполнителей, но суть в том, что я пытаюсь импортировать некоторый код из помощниковкаталог из скрипта my_package.py
.
Если бы я запускал my_package.py локально, мой код выполнялся бы без проблем - я думаю, что это ожидаемое поведение для python3.Однако, если я загружаю это в PyPI и затем импортирую пакет, я получаю следующую ошибку:
Traceback (most recent call last):
File "test.py", line 1, in <module>
import my_package
File "/Users/fakeUser/.virtualenvs/pip-testing/lib/python3.7/site-packages/my_package/__init__.py", line 1, in <module>
from . my_package import main_function
File "/Users/fakeUser/.virtualenvs/pip-testing/lib/python3.7/site-packages/my_package/my_package.py", line 6, in <module>
from helpers import helper1
ModuleNotFoundError: No module named 'helpers'
Чтобы решить эту проблему, я изменил импорт в my_package.py
, чтобы он выглядел так:
from .helpers import helper1
from .helpers import helper2
from .helpers import helper3
from .helpers import helper4
Насколько я понимаю, python3 использует .
, чтобы помочь разрешить относительный импорт.Это имело смысл попробовать для меня, потому что, если я запускаю my_package.py
, добавление .
должно прояснить, что каталог helpers
находится в том же каталоге, что и my_package.py
.Выполнение этой модификации фактически решает проблему загрузки пакета из pip, но теперь вводит следующую проблему, если я должен был запускать этот код локально:
Traceback (most recent call last):
File "my_package.py", line 6, in <module>
from .helpers import helper1
ModuleNotFoundError: No module named '__main__.helpers'; '__main__' is not a package
Я пытаюсь понять, что здесь происходит.В частности, если кто-то может объяснить следующее:
- Почему добавление
.
делает код несовместимым для локального использования? - Почему удаление
.
делает код несовместимымдля использования из pip?
Я действительно хочу понять, почему этот импорт не работает, чтобы избежать подобных проблем в будущем.