首页 > 解决方案 > importlib.import_module 忽略在 __init__.py 中进行的重新导出

问题描述

(最初是在r/learnpython上问的,但我想我也会在这里问。)

由于在处理 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但是为什么会发生这种情况,在这种情况下我有办法解决这个问题吗?

标签: pythondjangopython-modulepython-importlib

解决方案


所以,我在任何地方都创建了init .py,并将其放入 project_module/ init .py

考虑将 project_module/apps 添加到 PYTHONPATH 或者sys.path如果您真的决定app从导入中删除。这也是这个用例中的一个技巧,但更可预测。


推荐阅读