importlib.import_module игнорирует реэкспорт, сделанный в __init__.py - PullRequest
0 голосов
/ 02 мая 2020

(Первоначально спрашивался на r / learn python, но решил, что я тоже здесь спрошу.)

Поскольку эта проблема возникла при работе с django, я Я объясню в этом контексте.

Итак, у меня есть папка проекта django и несколько внутренних django приложений, находящихся в этой папке проекта, например:

project_module
├ apps
│ ├ app_module1
│ │ ├ models.py
│ │ └ ...
│ ├ app_module2
│ └ ...
├ settings.py
└ ...

теперь app_modules доступны как project_module.apps.app_module1 и так далее, но поскольку в именах project_module ничего не будет конфликтовать с именами приложений, я хотел бы удалить часть .apps, чтобы я мог просто ссылаться на них как project_module.app_module1 и так, последовательно.

Итак, я создаю __init__.py везде и помещаю это в project_module/__init__.py:

from .apps import app_module1

И этот вид работ, так как я могу import project_module.app_module1 и это похоже на работу.

НО, Django внутренне использует importlib.import_module здесь и там, и в этих случаях я сталкиваюсь с ModuleNotFoundError: No module named 'project_module.app_module1'. В этих случаях я могу снова использовать .apps, но такая последовательность нарушается.

Немного эксперимента, я убежден, import_module игнорирует реэкспорт из __init__.py; Но почему это происходит, и есть ли способ, которым я могу обойти это в этом случае?

1 Ответ

0 голосов
/ 02 мая 2020

Итак, я создаю init .py везде и помещаю это в project_module / init .py

Рассмотрите возможность добавления project_module / apps в PYTHONPATH или sys.path, если вы действительно решили удалить app из импорта. Это также хак в этом сценарии использования, но более предсказуемый.

...