Ошибка импорта в сельдерее

Это код, который я запускаю:

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

4 ответа

Решение

Я столкнулся с этой же ошибкой, и переименование файла исправило ее.

Для всех, кто столкнулся с этим, причина, по которой вы получаете эту проблему, ваш локальный celery.py импортируется вместо фактического пакета сельдерея, следовательно, причина, по которой python не может найти Celery(заглавная "C"), как в классе внутри пакет celery, но он находит celery(строчная буква "c"), то есть ваш локальный celery.py, в котором не определен класс Celery.

Я просто переименовал свой локальный celery.py в _celery.py, но любое имя, кроме celery.py, должно решить эту проблему.

Редактировать: Я также хотел упомянуть, что вызов демона celery вне каталога, в котором находится файл celery.py, также будет работать. Для тестирования будет достаточно переименования файла, но вы все равно можете использовать celery.py в качестве локального имени файла. Например, учитывая следующую структуру папок:

+ root /  
   - проект /  
     * celery.py  
     * tasks.py

Если вы звоните из сельдерея из корневой папки, вы должны набрать:

celery worker --app=proj [optional args]

Вы можете проверить наличие ваших задач, используя необязательный аргумент журнала "-l info" и просматривая список [tasks] непосредственно под вводными данными.

Более подробная информация находится в учебном документе здесь: http://docs.celeryproject.org/en/latest/getting-started/next-steps.html

У меня был этот вопрос вместе с pycharm и unittests, и хочу добавить дополнительный ответ. Я проверил это с Python 3, но предположим, что то же самое происходит, если вы используете from __future__ import absolute_import с более ранними версиями.

Основная причина описана в отчете об ошибке Pycharm https://youtrack.jetbrains.com/issue/PY-15889

Сводка: если вы запускаете юнит-тесты в pycharm, он всегда добавляет папку, содержащую тестовый скрипт, в начало 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

Для тех, кто все еще сталкивается с этой ошибкой даже после переименования вашего celery.py файл в каталоге вашего проекта, просто удалите celery.pyc файл также.

Если вы установили Celery в виртуальной среде, убедитесь, что выбран тот же интерпретатор Python, который соответствует этой виртуальной среде.

В VS Code вы можете выбрать интерпретатор здесь.

Вид — Палитра команд — Python: выбор интерпретатора

Другие вопросы по тегам