简体   繁体   中英

importlib.import_module ignoring re-exports made in __init__.py

(Originally asked on r/learnpython , but figured I'd ask here too.)

Since this problem came up while dealing with django, I'll explain in that context.

So I have a django project folder, and some internal django apps living in that project folder, like this:

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

now the app_modules are available as project_module.apps.app_module1 and so on, but since there won't be anything colliding with the app names in project_module , I'd like to drop the .apps part so I can just refer to them as project_module.app_module1 and such, consistently.

So, I create __init__.py everywhere, and put this into project_module/__init__.py :

from .apps import app_module1

And this sort of works, since I can import project_module.app_module1 and it seems to work.

BUT, Django internally uses importlib.import_module here and there, and in those cases I encounter ModuleNotFoundError: No module named 'project_module.app_module1' . In those cases I can use the .apps again, but this sort of breaks consistency.

A bit of experiment later, I'm convinced import_module ignores re-exports from __init__.py ; But why does this happen, and is there a way I can play around this in this case?

So, I create init .py everywhere, and put this into project_module/ init .py

Consider adding project_module/apps to PYTHONPATH or sys.path if you're really determined to remove app from imports. That's also a hack in this use-case, but more predictable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM