芹菜中的导入错误

Posted

技术标签:

【中文标题】芹菜中的导入错误【英文标题】:import error in celery 【发布时间】:2013-11-09 12:28:04 【问题描述】:

这是我正在运行的代码:

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

【问题讨论】:

您是否将脚本命名为celery.py 发布您的 celery.py 。我怀疑你定义了class Celery(object): 然后将其重命名为另一个,例如celery_test.py 通过将文件移动到另一个文件夹,程序运行,....我不知道为什么... 您在旧文件夹中有__init__.py 吗?也许这就是原因? 【参考方案1】:

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

对于遇到此问题的其他人,您遇到此问题的原因是您的本地 celery.py 被导入而不是实际的 celery 包,因此 python 找不到 Celery(capital "C") 的原因,如celery 包中的类,但它确实找到了 celery(lowercase "c"),这是您本地的 celery.py,其中没有定义 Celery 类。

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

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

+根/
   - 项目/
     * 芹菜.py
     * 任务.py

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

celery worker --app=proj [optional args]

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

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

【讨论】:

另外,在重命名或移动文件后,请记住rm *.pyc,因为 Python 会继续从 celery.pyc 文件中加载错误的 celery 模块。【参考方案2】:

我与 pycharm 和 unittests 一起遇到了这个问题,并想添加一个额外的答案。我已经使用 python 3 对其进行了测试,但假设如果您将 from __future__ import absolute_import 与早期版本一起使用,也会发生同样的情况。

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

总结:如果你在pycharm中运行unittests,它总是将包含测试脚本的文件夹添加到sys.pathbeginning。如果你的celery.py在同一个路径下,python会先尝试加载。

我没有更改文件名,而是通过在我的..._Test.py 测试脚本中导入celery.py 之前从sys.path 中删除此文件夹来解决此问题。

# 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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于芹菜中的导入错误的主要内容,如果未能解决你的问题,请参考以下文章

芹菜工人错误:ImportError no module named celery

为啥不安装芹菜

芹菜中的预取任务是不是被确认?

检索芹菜队列中的任务列表

芹菜节拍进程在启动时分配大量内存

芹菜不处理来自 RabbitMQ 的任务