Ошибка импорта в сельдерее
Это код, который я запускаю:
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: выбор интерпретатора