如何避免Python模块系统中的命名冲突?
在我的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
,而hotshot
又试图导入profile
。但是,profile
是从我的项目中导入的,而它本应该是从系统的Python中导入。
显然,我自己的profile
模块和系统的profile
模块发生了冲突。我显然不能把Python自带的每个模块名都排除在我的编程之外。那么接下来我该怎么办呢?我需要为我的所有应用创建一个myproject
的命名空间吗?Django能这样工作吗?
附注:表名hotshot_profile
似乎是因为与我项目中使用的pybb
里的Profile
类发生了命名冲突,但这不在这个问题的范围内。
1 个回答
5
你绝对不应该用 import mymodule
这种方式来导入你自己写的模块(这种叫相对导入)。你应该始终使用 import myproject.mymodule
这种方式(叫绝对导入)。这样可以避免名字冲突的问题。