rabbitmq 导入错误:无法从“celery”导入名称“Celery”

l5tcr1uw  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(300)

导入错误:无法从“celery”导入名称“Celery”
代码在我的本地机器上运行良好。当我在Azure服务器上运行此代码时,会创建此问题。
我还将celery.py文件重命名为celeryy.py文件,然后检查错误是否仍然相同。
下面是我的项目文件结构在下面的屏幕截图。

__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

of1yzvn4

of1yzvn41#

简短答案:

这里你的问题是你已经命名了一个子模块(也就是一个python文件)或者一个包(也就是一个文件夹),它和你想要导入的包同名celery,因此你需要改变这个文件的名称,以便导入正确的包。

更多详细信息:

Python导入模块检查sys.path中指定的路径中的包名。

print(sys.path)

您将得到一个路径列表,解释器将从该路径开始以相同的顺序搜索包名,第一个路径是您的当前目录路径,因此一旦它在您的当前工作目录中找到该路径,它将导入该路径,并且不会继续搜索。
欲知更多详情,你可以阅读here的文档

oknwwptz

oknwwptz2#

我有这个完全相同的问题,你描述的方式,它开始发生,直到最近(CI失败10月3日,2022年,但工作正常9月25日,2022年,没有相关的变化)。
最终的原因是在我的CI中,importlib-metadata开始安装版本5.0.0,这导致了错误(与4.12.0一起工作正常)。
为了暂时修复它,我只是将importlib-metadata==4.13.0添加到我的environment.yml文件中,之后问题就解决了。

相关问题