Python相对导入问题

0 投票
1 回答
756 浏览
提问于 2025-04-16 04:32

我正在使用Python 2.6,并且已经安装了Facebook的API作为一个Python包(在/usr/lib64/python2.6/site-packages/facebook/...下),这意味着我可以直接用 import facebookfrom 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 个回答

0

显然(根据这个链接),没有办法绕过 from __future__ import absolute_import 这行代码,所以我想我只能接受使用这个 __future__ 的导入方式来解决我遇到的名字冲突问题。

撰写回答