Подтвердить что ты не робот

Запуск Celery: AttributeError: объект 'module' не имеет атрибута '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'

Кто-нибудь знает, почему атрибут "сельдерей" не может быть найден? Благодарим вас за помощь.

Операционная система - Linux Debian 5.

Edit. Может быть ключ. Может ли кто-нибудь объяснить мне следующий комментарий функции (почему мы должны быть уверены, что он находит модули в текущем каталоге)?

# 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)
4b9b3361

Ответ 1

Я забыл создать объект celery в tasks.py:

from celery import Celery
from celery import task  

celery = Celery('tasks', broker='amqp://[email protected]//') #!

import os

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

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

После этого мы могли нормально запускать задачи:

celery -A tasks worker --loglevel=info

Ответ 2

Celery использует файл celery для хранения конфигурации вашего приложения, вы не можете просто предоставить файл python с задачами и запустить сельдерей. Вы должны определить файл celery (для Celery > 3.0, ранее он был celeryconfig.py)..

celeryd --app app.celery -l info

В этом примере, как запустить сельдерей с конфигурационным файлом в app/celery.py

Вот пример файла сельдерея: https://github.com/Kami/libcloud-sandbox/blob/master/celeryconfig.py

Ответ 3

Попробуйте начать сельдерей:

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

В tasks.py:

имеется следующий script
@task(name="my_queue", routing_key="my_queue")
def add_photos_task( lad_id ):

Следующий script в 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://[email protected]//')

Ответ 4

Для тех, кто получает одинаковое сообщение об ошибке по-разному, обратите внимание, что если какой-либо импорт из файла инициализации завершится неудачно, ваше приложение поднимет этот полностью двусмысленный AttributeError, а не исключение, изначально вызвавшее его.