ImportError: cannot import name 'Celery' from 'celery'
ImportError: cannot import name 'Celery' from 'celery'
Код работает нормально на моей локальной машине. Когда я запускаю этот код на сервере azure, возникает эта проблема.
ниже приведена структура файлов моего проекта на скриншоте.
__init__.py файл:
from __future__ import absolute_import
from core.celery import app as celery_app
__all__ = ['celery_app']
celery.py файл:
from __future__ import absolute_import
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
app = Celery('core')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
task.py файл:
from celery import shared_task
from time import sleep
from azure.datalake.store import core, lib, multithread
from django.core.mail import send_mail
token = lib.auth()
adls_client = core.AzureDLFileSystem(token, store_name='bnlweda04d3232gsdfs')
@shared_task
def sleepy(duration):
sleep(duration)
return None
@shared_task
def send_email_task(subject,message,from_email,recipient_email,fail_silently):
sleep(30)
send_mail(
subject,message,from_email,recipient_email,fail_silently
)
return 'Mail sent success'
Я использую версию celery: 4.4.0 и версию python: 3.8.10
Сокращенный ответ:
Ваша проблема в том, что вы назвали подмодуль (он же файл python)
или пакет (он же папка) с тем же именем пакета, который вы хотите импортировать celery, поэтому вам нужно изменить имя этого файла, чтобы импортировать правильный пакет.
Подробнее:
.
Модуль импорта Python проверяет имя пакетов в путях, указанных в порядке sys.path. Поэтому если вы напечатали
print(sys.path)
Вы получите список путей, по которым интерпретатор начнет искать имя пакета в том же порядке, и первый путь - это путь к вашей текущей директории, поэтому, как только он найдет его в вашей текущей рабочей директории, он импортирует его и не будет продолжать поиск.
для более подробной информации вы можете прочитать документацию здесь
У меня была точно такая же проблема, как вы описали, и это начало происходить совсем недавно (CI не сработал 3 октября 2022 года, но работал нормально 25 сентября 2022 года, без каких-либо связанных изменений в промежутке).
В итоге причиной стало то, что в моем CI, importlib-metadata начал устанавливать версию 5.0.0, которая выдавала ошибку (Работала нормально с 4.12.0).
Чтобы исправить это на данный момент, я просто добавил importlib-metadata==4.13.0 в мой environment.yml файл, после чего проблема была решена.
https://github.com/python/importlib_metadata/issues/411
Понижение версии importlib-metadata до 4.13.0.
