如何使用字符串访问 python 模块变量 [django]

Posted

技术标签:

【中文标题】如何使用字符串访问 python 模块变量 [django]【英文标题】:How to access a python module variable using a string [ django ] 【发布时间】:2011-10-30 14:55:21 【问题描述】:

我有一个 django 应用程序,带有一个名为 "app" 的模块 现在这个模块有一个名为 "urls.py" 的文件,其中有一个名为 "HOME_URL"

的变量

我想做什么?

app_label = "app"
url = __import__(app_label).urls.HOME_URL
print url

这显然行不通,但我希望你能得到我想要做的事情,如果没有,请发表评论,我将编辑问题以包含更多信息。

【问题讨论】:

这在一般情况下对我有用。您会收到什么样的错误消息? 【参考方案1】:

如果您使用的是 Django 1.7+,则应改用 import_string

from django.utils.module_loading import import_string
app_label = "app"
url = import_string("%s.urls.HOME_URL" % app_label)

顺便说一下,关于 Python 模块和包的一些说明。

是一个包含文件的文件夹,其中包括一个名为__init__.py 的文件。听起来你的“应用程序”“模块”实际上是一个包。

module 是包中的.py 文件。所以你的urls.py实际上是一个模块。

【讨论】:

【参考方案2】:

您可以使用import_module 加载相对于 django 项目根目录的模块。

from django.utils.importlib import import_module
app_label = "app"
url = import_module("%s.urls" % app_label).HOME_URL 

这应该可以在您的 django 项目或./manage.py shell 中使用。

【讨论】:

在 Django 1.11 中,这会导致 ImportError: No module named importlib;知道这个助手已经移动到哪里或者它是否还在那里? 如果遇到@KurtPeek 提到的导入错误,请使用 Python import_module:from importlib import import_module 在 Django 1.11 中:从 django.utils 导入模块加载

以上是关于如何使用字符串访问 python 模块变量 [django]的主要内容,如果未能解决你的问题,请参考以下文章

python中各模块变量共享的问题。

python-聊聊反射

在 Python 中,如何从导入的模块访问主模块的命名空间?

python 归纳 _模块变量作用域

ImportError:导入 dj_database_url ImportError:没有名为“dj_database_url”的模块

字符串形式导入模块