Использование инструкций импорта в подмодуле init.py файл на Python

#python

Вопрос:

У меня есть следующая структура папок:

 - a/
  - test.py
  - b/
    - __init__.py (empty)
    - c/
      __init.py (imports classes from x.py and z.py)
      x.py
      z.py
 

test.py Содержание:

 from b.c import SomeClient
 

Я пытаюсь выполнить импорт c test.py , но получаю следующую ошибку:

 ModuleNotFoundError: No module named 'c'
 

Содержимое папки __init__.py под c/ папкой выглядит следующим образом:

 from c.x import SomeClient
from c.z import AnotherClient
 

Я попытался удалить c. указатель из инструкций импорта, но он начинает выдавать ошибки, указывающие на отсутствие модуля с именем x или z .

Ответ №1:

Файл a/b/c/__init__.py импортирует файлы относительно c . Проблема в том, что использование неявного относительного импорта (а также в этой ссылке) уже удалено в Python3:

Больше нет никакого скрытого импортного оборудования

Либо используйте абсолютный импорт в своем a/b/c/__init__.py

 from b.c.x import SomeClient
from b.c.z import AnotherClient
 

Или явный относительный импорт

 from .x import SomeClient
from .z import AnotherClient
 

Если это невозможно, просто укажите PYTHONPATH , где c можно найти каталог, чтобы Python мог видеть модули в нем при импорте. Если в Linux:

 export PYTHONPATH=${PYTHONPATH}:/path/to/a/b
 

Комментарии:

1. Я попробовал, однако, у импортированных классов также есть import инструкции, начинающиеся с c. префикса, и содержимое c/ папки генерируется генератором (openapi-генератор), я никак не могу войти туда и обновлять все инструкции импорта каждый раз, когда создается эта папка. 😞

2. Я обновил ответ, чтобы установить PYTHONPATH его в вашей среде выполнения. Работает ли это сейчас на вашей стороне?

3. это будет в проекте django; разве нет способа сделать это без шага настройки(нет необходимости обновлять pythonpath и т. Д.)?

4. Без обновления файлов внутри c каталога? Вы можете попробовать выполнить явный относительный импорт, например, from .x import SomeClient но я предполагаю, что вы не можете изменить файлы в c каталоге, верно?

5. С моей точки зрения, поскольку все коды внутри c каталога обращаются к нему на основе корневого c каталога , вам действительно нужно включить путь к c в пути, которые ищет Python для модулей. Один из способов-через ответ @U12-Forward или мой ответ с настройкой PYTHONPATH .