开始芹菜:AttributeError:“模块”对象没有属性“芹菜”

Posted

技术标签:

【中文标题】开始芹菜:AttributeError:“模块”对象没有属性“芹菜”【英文标题】:Starting Celery: AttributeError: 'module' object has no attribute 'celery' 【发布时间】:2012-11-13 08:54:36 【问题描述】:

我尝试从命令行启动 Celery 工作服务器:

celery -A tasks worker --loglevel=info

tasks.py中的代码:

import os
os.environ[ 'DJANGO_SETTINGS_MODULE' ] = "proj.settings"

from celery import task

@task()
def add_photos_task( lad_id ):
...

我得到下一个错误:

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 8, in <module>
    load_entry_point('celery==3.0.12', 'console_scripts', 'celery')()
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.egg/celery/__main__.py", line 14, in main
    main()
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.egg/celery/bin/celery.py", line 946, in main
    cmd.execute_from_commandline(argv)
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.egg/celery/bin/celery.py", line 890, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.egg/celery/bin/base.py", line 177, in execute_from_commandline
    argv = self.setup_app_from_commandline(argv)
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.egg/celery/bin/base.py", line 295, in setup_app_from_commandline
    self.app = self.find_app(app)
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.egg/celery/bin/base.py", line 313, in find_app
    return sym.celery
AttributeError: 'module' object has no attribute 'celery'

有人知道为什么找不到 'celery' 属性吗?谢谢你的帮助。

操作系统是Linux Debian 5。

编辑。可能是线索。谁能解释一下函数的下一条评论(为什么我们必须确保它在当前目录中找到模块)?

# from celery/utils/imports.py
def import_from_cwd(module, imp=None, package=None):
    """Import module, but make sure it finds modules
    located in the current directory.

    Modules located in the current directory has
    precedence over modules located in `sys.path`.
    """
    if imp is None:
        imp = importlib.import_module
    with cwd_in_path():
        return imp(module, package=package)

【问题讨论】:

你不使用djcelery吗? @patrys 'celery' 和 'django-celery' 包都已安装。我明白你的问题吗? 如果你安装了 Django 绑定,为什么不改用$ ./manage.py celeryd @patrys 从命令行检查功能很方便(当我设置服务器时)。我想在控制台窗口中看到一些输出。 【参考方案1】:

当你运行 celery -A tasks worker --loglevel=info 时,你的 celery 应用应该暴露在模块 tasks 中。它不应包含在函数或 if 语句中。

如果你 make_celery 在另一个文件中,你应该将 celery 应用程序导入到你传递给 celery 的文件中。

【讨论】:

【参考方案2】:

我的问题是我将celery 变量放在了主函数中:

if __name__ == '__main__':  # Remove this row
    app = Flask(__name__)
    celery = make_celery(app) 

什么时候应该放在外面。

【讨论】:

【参考方案3】:

对于由于明显不同的原因而收到相同错误消息的任何人,请注意,如果您的初始化文件中的任何导入失败,您的应用程序将引发这个完全模棱两可的AttributeError,而不是最初导致它的异常。

【讨论】:

感谢您的提示。当我不小心将导入变为圆形时,我会得到这个,所以这是需要注意的。 谢谢!我在if __name__ == '__main__': 中使用了一个未声明的变量,因为我拼错了。我看着我的项目目录变得疯狂,因为问题不存在!不在 celeryconfig 中!【参考方案4】:

Celery 使用celery 文件来存储您的应用程序的配置,您不能只提供一个带有任务的python 文件并启动celery。 您应该定义 celery 文件(对于 Celery>3.0;以前是 celeryconfig.py)..

celeryd --app app.celery -l 信息

这个例子如何使用app/celery.py的配置文件启动celery

这里是芹菜文件的例子:https://github.com/Kami/libcloud-sandbox/blob/master/celeryconfig.py

【讨论】:

谢谢。但我在 Windows 上这样做,它工作正常。我没有特殊的配置文件。我是否正确理解 Celery 文档(您能看一下吗?):docs.celeryproject.org/en/latest/getting-started/… 您存储代理设置等的位置。 是的,如果你按照我的来改的话。 你实际上忘了做什么?我有类似的问题(见***.com/questions/17007101/…) @kanitw 请看我的回答。【参考方案5】:

尝试启动芹菜:

celeryd --config=my_app.my_config --loglevel=INFO --purge -Q my_queue

我的tasks.py中有下一个脚本:

@task(name="my_queue", routing_key="my_queue")
def add_photos_task( lad_id ):

my_config.py中有下一个脚本:

CELERY_IMPORTS = \
(
    "my_app.tasks",
)
CELERY_ROUTES = \

    "my_queue":
    
        "queue": "my_queue"
    ,

CELERY_QUEUES = \

    "my_queue":
    
        "exchange": "my_app",
        "exchange_type": "direct",
        "binding_key": "my_queue"
    ,

celery = Celery(broker='amqp://guest@localhost//')

【讨论】:

【参考方案6】:

我忘记在tasks.py中创建一个芹菜对象:

from celery import Celery
from celery import task  

celery = Celery('tasks', broker='amqp://guest@localhost//') #!

import os

os.environ[ 'DJANGO_SETTINGS_MODULE' ] = "proj.settings"

@task()
def add_photos_task( lad_id ):
...

之后我们就可以正常启动任务了:

celery -A tasks worker --loglevel=info

【讨论】:

以上是关于开始芹菜:AttributeError:“模块”对象没有属性“芹菜”的主要内容,如果未能解决你的问题,请参考以下文章

pytorch,AttributeError:模块“火炬”没有属性“张量”

芹菜 - 没有名为五的模块

AttributeError:“模块”对象没有属性“情节”-Seaborn

AttributeError:“模块”对象没有属性“maketrans”

AttributeError:模块“crontab”没有属性“CronSlices”

芹菜工人 ImportError:没有名为“项目”的模块