【问题标题】:How do I avoid naming clashes within Python's module system?如何避免 Python 模块系统中的命名冲突?
【发布时间】:2011-12-31 13:20:55
【问题描述】:

在我的 Django 项目中,我有一个名为 profile 的应用程序,它主要包含我的 profile.models.UserProfile 类,以获取有关 User 对象的更多信息(对于 Django 人来说可能看起来很熟悉)。现在我将一些初始化代码放入profile/__init__.py(一些信号)并遇到了一个问题:Django 告诉我尚未找到名为hotshot_profile 的表。

经过数小时的搜索,我将问题追溯到导入订单。运行python -v manage.py test 我发现了以下内容:

import nose.plugins.prof # precompiled from /home/rassie/.virtualenvs/myproject/lib/python2.6/site-packages/nose/plugins/prof.pyc
import hotshot # directory /usr/lib64/python2.6/hotshot
import hotshot # precompiled from /usr/lib64/python2.6/hotshot/__init__.pyc
dlopen("/home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so", 2);
import _hotshot # dynamically loaded from /home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so
import hotshot.stats # from /usr/lib64/python2.6/hotshot/stats.py
import profile # directory /home/rassie/MyProject/apps/profile
import profile # precompiled from /home/rassie/MyProject/apps/profile/__init__.pyc

所以我的鼻子跑步者导入nose.plugins.prof(即使这个插件已关闭),导入hotshot,它试图导入profile。但是,profile 是从 我的项目 导入的,而它应该是从系统 Python 导入的。

显然,我自己的profile 模块与系统profile 模块发生冲突。我显然不能从我自己的编程中排除与 Python 捆绑在一起的每个模块名称。所以问题是,我从这里去哪里?我是否必须为我的所有应用程序创建一个 myproject 命名空间? Django 会使用它吗?

PS:表的名称hotshot_profile 似乎来自与pybb 中的Profile 类的进一步尚未完全分析的命名冲突,我也在我的项目中使用它。但这超出了这个问题的范围。

【问题讨论】:

    标签: python django python-module python-import


    【解决方案1】:

    您永远不应该以import mymodule(相对导入)的形式导入您自己的模块。相反,您应该始终使用 import myproject.mymodule (绝对导入)。这样可以避免所有名称冲突。

    【讨论】:

    • 我一直认为我已经按照我能找到的关于 Django 的所有建议使用了绝对导入。看来我需要将我的应用程序放入命名空间,然后放入全局路径并按照您的说法导入它们。我们会看看这是否顺利:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2013-04-12
    • 2013-03-17
    • 1970-01-01
    • 2019-03-04
    相关资源
    最近更新 更多