芹菜'模块'对象没有属性' app'使用Python 3时

时间:2015-06-09 21:36:29

标签: python python-3.x celery

我正在阅读Celery教程。他们正在使用Python2,我正在尝试使用python3实现相同的功能。

我有2个文件:

celery_proj.py

from celery import Celery

app = Celery(
    'proj', broker='amqp://', backend='amqp://', include=['proj.tasks'])

app.conf.update(Celery_TAST_RESULT_EXPIRES=3600,)

if __name__ == '__main__':
    app.start()

tasks.py

from celery_proj import app


@app.task
def add(x, y):
    return x + y


@app.task
def mul(x, y):
    return x * y


@app.task
def xsum(numbers):
    return sum(numbers)

当我尝试运行celery -A proj worker -l info时,我得到了:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/celery/app/utils.py", line 235, in find_app
    found = sym.app
AttributeError: 'module' object has no attribute 'app'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.4/dist-packages/celery/__main__.py", line 30, in main
    main()
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/celery.py", line 81, in main
    cmd.execute_from_commandline(argv)
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/celery.py", line 769, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 309, in execute_from_commandline
    argv = self.setup_app_from_commandline(argv)
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 469, in setup_app_from_commandline
    self.app = self.find_app(app)
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 489, in find_app
    return find_app(app, symbol_by_name=self.symbol_by_name)
  File "/usr/local/lib/python3.4/dist-packages/celery/app/utils.py", line 240, in find_app
    found = sym.celery
AttributeError: 'module' object has no attribute 'celery'

我做错了什么以及如何解决这个问题?

5 个答案:

答案 0 :(得分:3)

如果您使用的是Python 3,则可以通过以下方式使用绝对导入:from __future__ import absolute_import

以下是我最近的Python 3,Django 1.7应用程序中的示例celery.py

from __future__ import absolute_import

import os
import django

from celery import Celery
from django.conf import settings


# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings')
django.setup()

app = Celery('my_app')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

答案 1 :(得分:3)

使用celery -A proj worker

运行Celery时
AttributeError: 'module' object has no attribute 'app'
...
AttributeError: 'module' object has no attribute 'celery'

告诉你它试图找到:

a)app实例

b)proj.celery模块

因此,您可以将from celery_proj import app添加到__init__.py,也可以将celery_proj.py重命名为celery.py

或者您可以将Celery作为celery -A proj.celery_proj worker

运行

我找到了答案here,因为stackoverflow上的答案没有帮助我。

答案 2 :(得分:2)

我一直在玩,并且理解了一件有趣的事情。 当我们运行celery -A proj worker -l info时,我们基本上运行proj文件夹。我相信,当你运行proj文件夹时,芹菜会在那里查找celery.py文件。在python2中没关系,因为我们使用绝对导入并且可以写from proj.celery import ...但是在python3中没有这种可能性。我们需要编写from celery import ...这会导致错误,因为celery是一个模块,因此我们需要将celery.py重命名为其他内容。当我们这样做时,我们无法再运行proj。也许我错了,但至少我让它成功了......

您需要做的是打开proj目录并从那里运行tasks.py,然后才能使用from celery_proj import app并保留celery_proj

如果我弄错了,请写信并添加您的解决方案。

答案 3 :(得分:0)

在docker容器中运行celery和django应用程序时,我遇到了同样的问题。看起来celery worker命令在当前目录中搜索celery应用。从任意目录运行命令时,会出现此属性未找到错误。但是,当它从django应用程序目录(可以在其中找到应用程序/模块)运行时,celery worker将按预期运行。

答案 4 :(得分:0)

当我为主项目目录和应用程序目录提供相同的名称时,我遇到了一个与docker奇怪的情况。

更正我解决的卷中已解决问题的路径(-./app:/app)检查docker部分中的celery配置部分。

-app:
    ..
    app:
        __init__.py
        celery.py

初始化 .py

from __future__ import absolute_import

from .celery import app as celery_app

__all__ = ['celery_app']

celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')

app = Celery('app')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

因此,我必须在音量部分提供正确的路径

celery:
    build: .
    command: celery -A app worker -l info
    volumes:
     - ./app:/app
    depends_on:
     - db
     - redis