Ошибка импорта в сельдерее
это код, который я запускаю:
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
Ответы
Ответ 1
Я столкнулся с этой же ошибкой и переименовал файл, исправил его.
Для кого-то, кто сталкивается с этим, причина, по которой вы получаете эту проблему, ваш локальный celery.py импортируется вместо фактического пакета сельдерея, поэтому причина, по которой python не может найти Celery (капитал "C" ), как в класс в пакете сельдерея, но он находит сельдерей (нижний регистр "c" ), который является вашим местным сельдерей .py, который не имеет определенного в нем класса сельдерея.
Я просто переименовал свой локальный файл celery.py в _celery.py, но любое имя, кроме celery.py, должно решить проблему.
Изменить:
Я также хотел упомянуть, что вызов демона сельдерея за пределами каталога, в котором находится файл celery.py, тоже будет работать. Для целей тестирования достаточно переименовать файл, но вы все равно можете использовать celery.py в качестве своего локального имени файла. Например, учитывая следующую структуру папок:
+ root/
- proj/
* celery.py
* tasks.py
Если вы вызываете сельдерей из корневой папки, вы должны иметь возможность вводить:
celery worker --app=proj [optional args]
Вы можете проверить, что ваши задачи присутствуют, используя необязательный лог-аргумент "-l info" и просмотр списка [задач] непосредственно под вводными данными.
Дополнительная информация содержится в учебниках docs: http://docs.celeryproject.org/en/latest/getting-started/next-steps.html#about-the-app-argument
Ответ 2
У меня была эта проблема вместе с pycharm и unittests, и я хочу добавить дополнительный ответ. Я тестировал его с помощью python 3, но предполагаю, что это произойдет, если вы используете from __future__ import absolute_import
с более ранними версиями.
Основная причина описана в отчете об ошибке pycharm https://youtrack.jetbrains.com/issue/PY-15889
Резюме. Если вы запускаете unittests в pycharm, он всегда добавляет папку, содержащую тест script, в начало 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
Ответ 3
Для тех, кто все еще сталкивается с этой ошибкой даже после переименования вашего файла celery.py
внутри вашего каталога проекта, просто удалите файл celery.pyc
.