Импорт Python3 - запуск локальных и пипсовых расхождений - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть небольшой 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?

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

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Оригинальный постер здесь:

Проблема была вызвана тем фактом, что pip установит пакет на уровне my_package, поэтому полагается на импорт, который будет настроен как .helpers или my_package.helpers, тогда как запуск сценария my_package.py не устанавливает пакет, и, следовательно, импорт должен быть написан по-другому.

Я отмечу, что это правильный ответ как можно скорее (я верю, что это будет завтра)

0 голосов
/ 16 апреля 2019

Для начала прочтите modules Start, используя следующий шаблон

my_package
|  README.md
|  LICENSE
|  setup.py
|  build
|  dist
|  src
|  --my_package
|  ---- __init__.py
|  ---- helpers
|  ------__init__.py
|  ------ helper1.py
|  ------ helper2.py
|  ------helper3.py
|  ------helper4.py

Вы можете определить верхний уровень __init__.py на данный момент пустой, а внутренний __init__.py в зависимости от того, как выглядит helperx.py, а затем, когда вы устанавливаете модуль, вы можете соответственно вызвать helper1, например, from my_package.helpers import helper1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...