芹菜中的导入错误

时间:2013-10-30 04:09:17

标签: python celery pycharm celery-task

这是我正在运行的代码:

from __future__ import absolute_import
from celery import Celery
celery1 = Celery('celery',broker='amqp://',backend='amqp://',include=['tasks'])

celery1.conf.update(
   CELERY_TASK_RESULT_EXPIRES=3600,
       )
if __name__ == '__main__':
 celery1.start()

当我执行上面的代码时,它给出了以下错误:

   ImportError: cannot import name Celery

3 个答案:

答案 0 :(得分:32)

我也遇到了同样的错误并重命名了修复它的文件。

对于其他遇到此问题的人来说,为什么你得到这个问题,你的本地celery.py正在导入而不是实际的芹菜包,因此python找不到Celery(大写“C”)的原因,如芹菜包中的类,但它确实找到芹菜(小写“c”),这是你的本地celery.py,里面没有定义Celery类。

我刚刚将我的本地celery.py重命名为_celery.py,但celery.py以外的任何名称都可以解决此问题。

编辑: 我还想提一下,在celery.py文件所在的目录之外调用celery守护进程也可以。出于测试目的,重命名文件就足够了,但您仍然可以使用celery.py作为本地文件名。例如,给定以下文件夹结构:

+ root/  
   - proj/  
     * celery.py  
     * tasks.py

如果从根文件夹中调用celery,则应该可以输入:

celery worker --app=proj [optional args]

您可以使用“-l info”可选日志参数验证您的任务是否存在,并查看介绍数据正下方的[任务]列表。

更多信息位于此处的教程文档中:http://docs.celeryproject.org/en/latest/getting-started/next-steps.html#about-the-app-argument

答案 1 :(得分:1)

我和pycharm以及unittests一起遇到了这个问题,并希望添加一个额外的答案。我已经使用python 3对其进行了测试,但假设在早期版本中使用from __future__ import absolute_import则会发生同样的情况。

根本原因在pycharm错误报告https://youtrack.jetbrains.com/issue/PY-15889

中描述

摘要:如果您在pycharm中运行unittes,它总是将包含测试脚本的文件夹添加到sys.path开头。如果您的celery.py位于同一路径中,python将首先尝试加载它。

我在sys.path测试脚本中导入celery.py之前,已从..._Test.py删除此文件夹,而不是更改文件名。

# If running in pycharm, pycharm always adds the current path to the beginning (!) of sys.path
# I have not found a setting to fix this - so I just remove the path again
# This block can be removed once https://youtrack.jetbrains.com/issue/PY-15889 if fixed
import sys
import os
sys.path.remove(os.path.dirname(__file__)) 

import celery

答案 2 :(得分:0)

对于那些即使在项目目录中重命名celery.py文件后仍然遇到此错误的人,也只需删除celery.pyc文件。