Python相对导入问题
我正在使用Python 2.6,并且已经安装了Facebook的API作为一个Python包(在/usr/lib64/python2.6/site-packages/facebook/...下),这意味着我可以直接用 import facebook
或 from facebook import ...
来使用它。
这很好用,只要没有名字冲突。例如,在我的项目中,我尝试在代码中通过 project.facebook
来导入Facebook API,代码如下:
from .facebook import GraphAPI
根据我的理解,这应该是可以的,因为点号明确告诉Python去上一级包里找,而不是去导入它已经在解析的 project.facebook
包。
但是,它并没有成功:
无法导入 project.views。错误信息是:无法导入名称 GraphAPI
project.views 是另一个源代码文件,它包含了 project.facebook(我在使用Django,但不确定这是否有关系)。
我知道,我可以简单地重命名我的源文件,或者使用 from __future__ import absolute_import
(这样可以正常工作),但我觉得这两种方法都是变通的解决方案。
有没有什么原因导致 from .facebook import ...
不工作呢?
更新:
这是我工作区目录下执行 ls -R 命令的输出(其中只有 proj 这个项目)。
以下内容位于 /home/chris/dev/workspace/ 下,而Facebook的Python API是全局安装的(在 /usr/lib64/python2.6/site-packages/facebook/... 下)。
./proj/templates: ...
./proj/templates: ...> ./proj: README src static templates
./proj/src:
__init__.py __init__.pyc manage.py settings.py settings.pyc
settings_local.py settings_local.pyc
urls.py urls.pyc proj
./proj/src/proj:
__init__.py admin.py auth.py facebook.py forms.py halloffame.py
helper.py image.py management
middleware.pyc models.pyc openid.pyc
stats.pyc twitter.pyc urls.pyc
views.pyc
__init__.pyc admin.pyc auth.pyc facebook.pyc forms.pyc
halloffame.pyc helper.pyc image.pyc
middleware.py models.py
openid.py stats.py twitter.py
urls.py views.py
./proj/src/proj/management:
__init__.py __init__.pyc commands
./proj/src/proj/management/commands:
__init__.py __init__.pyc cronjob.py cronjob.pyc
./proj/templates: ..../proj/templates: ...
./proj/templates: ...
1 个回答
显然(根据这个链接),没有办法绕过 from __future__ import absolute_import
这行代码,所以我想我只能接受使用这个 __future__
的导入方式来解决我遇到的名字冲突问题。