python - 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
但是为什么会发生这种情况,在这种情况下我有办法解决这个问题吗?
解决方案
所以,我在任何地方都创建了init .py,并将其放入 project_module/ init .py
考虑将 project_module/apps 添加到 PYTHONPATH 或者sys.path
如果您真的决定app
从导入中删除。这也是这个用例中的一个技巧,但更可预测。
推荐阅读
- flutter - 减少颤动中复选框和标题之间的空间
- python - 根据 Pandas 数据框中的 ID 将列值转换为列表
- javascript - 在 openapi-generator-cli 生成的 javascript 代码中禁用设置 User-Agent
- swift - Swift:Mailgun 401 响应代码——未提供有效的 API 密钥
- c# - 如何在 sqlite 中使用 WHERE 语句
- java - 从 Firestore 中检索数据(任务 > DocumentSnapshot > 对象)?
- python - FutureWarning:不推荐使用非元组序列进行多维索引
- laravel - 如何在不中断油门中间件的情况下清除缓存?拉拉维尔 8
- firebase - 我的单页网站没有 API 调用和 url 参数。我可以在不使用云功能的情况下通过 Firebase 托管实现 Angular Universal
- python - Plot a circle on a cartopy mercator projection