absolute_import无法正常工作(在芹菜项目中)

时间:2015-05-27 14:03:39

标签: python import celery

我正在尝试设置一个简单的芹菜项目。根据{{​​3}},布局如下:

clemux@melody ~/dev/debian/debsources/debsources
% find new_updater -name "*.py" 
new_updater/tasks.py
new_updater/updater.py
new_updater/__init__.py
new_updater/celery.py

在celery.py中,我以这种方式导入celery.Celery:

from __future__ import absolute_import
from celery import Celery

在IPython中,我可以毫无问题地导入new_updater.celery:

In [2]: from debsources.new_updater import celery
In [3]: celery?
Type:        module
String form: <module 'debsources.new_updater.celery' from '/home/clemux/dev/debian/debsources/debsources/new_updater/celery.pyc'>

但是,在尝试运行new_updater.updater时,我遇到以下错误:

clemux@melody ~/dev/debian/debsources
% python debsources/new_updater/updater.py
Traceback (most recent call last):
  File "debsources/new_updater/updater.py", line 6, in <module>
    from debsources.new_updater.tasks import print_package
  File "/home/clemux/dev/debian/debsources/debsources/new_updater/tasks.py", line 3, in <module>
    from debsources.new_updater.celery import app
  File "/home/clemux/dev/debian/debsources/debsources/new_updater/celery.py", line 3, in <module>
    from celery import Celery
  File "/home/clemux/dev/debian/debsources/debsources/new_updater/celery.py", line 3, in <module>
    from celery import Celery
ImportError: cannot import name Celery

这可能会发生什么?

我知道我可以简单地将celery.py重命名为,例如celery_config.py(这是关于SO的这类问题的标准答案),但我更愿意解决这个问题,而不是偏离芹菜的官方文档。

编辑:我在new_updater / updater.py中打印出sys.path,结果如下:

['/home/clemux/dev/debian/debsources/debsources/new_updater',
'/home/clemux/dev/debian/debsources',
'/home/clemux/.virtualenvs/debsources/lib/python2.7',
<snip>

在其他导入“解决”问题之前删除sys.path[0],但我不明白为什么会出现这种情况。我是怎么做到的:

  1. mkvirtualenv test
  2. python setup.py develop位于我项目的根目录
  3. EDIT2:在virtualenv之外它是相同的,从debian安装芹菜,我的PYTHONPATH设置为:

    export PYTHONPATH=/usr/lib/python2.7/dist-packages:~/dev/debian/debsources
    

1 个答案:

答案 0 :(得分:2)

关于第一行如何进入sys.path

  

指定模块搜索路径的字符串列表。   从环境变量PYTHONPATH初始化,再加上一个   依赖于安装的默认值。在程序启动时初始化,   此列表的第一项path [0]是包含该目录的目录   用于调用Python解释器的脚本。

来自docs

无论如何,您不应该将文件命名为您使用的库,即使关闭也是如此。 docs这样做。将有助于避免许多可能的错误。