簡體   English   中英

importlib.import_module 忽略在 __init__.py 中進行的重新導出

[英]importlib.import_module ignoring re-exports made in __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

如果您真的決定從導入中刪除app ,請考慮將 project_module/apps 添加到 PYTHONPATH 或sys.path中。 這也是這個用例中的一個技巧,但更可預測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM