如何避免在Python的模块系统中命名冲突?

时间:2011-11-17 17:03:38

标签: python django python-module python-import

在我的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跑步者导入nose.plugins.prof(即使此插件已关闭),导入hotshot,尝试导入profile。但是,profile我的项目导入,而它已准备就绪,应从系统Python导入。

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

PS:表格的名称hotshot_profile似乎来自于另一个尚未完全分析的命名冲突,其中包含来自Profile的{​​{1}}类,我也在使用在我的项目中。但这不属于这个问题的范围。

1 个答案:

答案 0 :(得分:5)

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