ImportError: cannot import name 'Celery' from 'celery'

ImportError: cannot import name 'Celery' from 'celery'

Код работает нормально на моей локальной машине. Когда я запускаю этот код на сервере azure, возникает эта проблема.

ниже приведена структура файлов моего проекта на скриншоте.

enter image description here

__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.

Вернуться на верх