首页 > 解决方案 > 如何从 Django 中的项目级包导入而不与同名的应用级模块冲突?

问题描述

我有一个具有以下结构的 Django 项目(Python 2.7.15):

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py
        utils.py
    utils/
        __init__.py
        filters.py

在我的utils/filters.py文件中,我有一堂课MyFilter。但是,从 开始polls/admin.py,当我尝试运行时from utils.filters import MyFilter,我得到ImportError: No module named filters. 如何在不重命名polls/utils.py模块或utils包的情况下在民意调查应用程序中导入自定义过滤器?

注意:这不是循环导入问题。即使我没有从utils/filters.py. utils/这是和之间的名称冲突polls/utils.py。Python 试图在filters.MyFilter里面polls/utils.py找到它,但它没有找到它,所以它抛出了错误。我只是想想办法绕过这个冲突并强制python在项目根目录中filters.MyFilter的包内查找。utils/

标签: pythondjangopython-importpython-2.x

解决方案


在 Python 2 中,import utils是模棱两可的,因为它可以是相对或绝对导入。

如果您通过将以下导入添加到模块顶部来启用 Python 3 行为,

from __future__ import absolute_import

然后from utils.filters import MyFilter将被视为绝对导入并且将起作用。

一旦你添加了未来的导入,import .utils如果你想polls/utils.pypolls/admin.py.


推荐阅读