Как правильно настроить относительный импорт Python - PullRequest
1 голос
/ 28 октября 2019

У меня есть пользовательская библиотека Python (" common "), которая импортируется и используется из нескольких проектов Python.
Эта центральная библиотека имеет следующую структуру:

/common
  /__init__.py
  /wrapper.py
  /util
    /__init__.py
    /misc.py

Наша пользовательская библиотека находится в центральном месте /data/Development/Python, поэтому в моих проектах на Python у меня есть файл .env, чтобы включить нашу библиотеку:

PYTHONPATH="/data/Development/Python"

Это прекрасно работает, я могу, например, сделатьчто-то вроде:

from common.util import misc

Однако теперь я хочу использовать класс MyClass в common/wrapper.py из кода в common/util/misc.py. Таким образом, я попробовал следующий импорт в misc.py:

from ..wrapper import MyClass

Но это приводит к следующей ошибке:

Exception has occurred: ImportError
cannot import name 'MyClass'

Есть идеи, что я здесь не так делаю?

PS: Когда я делаю from .. import wrapper вместо этого, а затем из кода, который я использую wrapper.MyClass, тогда он работает нормально. Это имеет какой-то смысл?

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Он находит wrapper, в противном случае вы получите другую ошибку:

>>> from wibble import myclass
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'wibble'

Так что, похоже, wrapper не содержит MyClass. Опечатка?

0 голосов
/ 28 октября 2019

"Однако теперь я хочу использовать класс MyClass в common / wrapper.py из кода в common / util / misc.py. Таким образом я попытался выполнить следующий импорт в misc.py:"

Если вы делаете export PYTHONPATH=~/common

Чтобы импортировать MyClass, вам нужно будет сделать:

from wrapper import MyClass

Поскольку вы добавили общее в корневую папку, утилитыуже в вашем пути, поскольку он находится в вашей корневой папке.

Аналогично, если вы хотите импортировать из оболочки, вы должны сделать from utils.misc import ThisClass, так как utils.misc уже находится в корневой папке common

...