这是我正在运行的代码:
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
答案 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
文件。