#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
.