importing current_app from celery is gives ValueError: attempted relative import beyond top-level package

importing current_app from celery is gives ValueError: attempted relative import beyond top-level package

是的,我知道有很多关于与此值错误相关的堆栈溢出的类似问题,我尝试了他们的所有解决方案,但由于我是 Django 的新手并且 python 我无法解决这个问题。

我有一个名为 my_backend 的项目,它具有以下文件结构。

main_project/
   cmb_backend/
        __init__.py
        celery.py
        urls.py
    second_app/
        __init__.py
        moduleZ.py
    my_env/
       bin/
       include/
       lib/
         python 3.7/
           site-packages/
             celery/
             django_celery_beat
               admin.py

我在周期性任务中使用了芹菜,所以我在我的主应用程序中添加了一个 celery.py 文件 my_backend。

我还使用 pip 安装了 django_celery_beat,在其中,他们使用以下代码导入了芹菜。

# admin.py file in the django_celery_beat lib
from celery import current_app
from celery.utils import cached_property

所以当我运行这个命令

python3 my_backend/setup_database.py

它给我一个像

这样的错误
ImportError: cannot import name 'current_app' from 'celery' (/Users/pankaj/Desktop/Pankaj/MyJangoProjects/My_Project/my_backend/celery.py)

所以从这个错误中,我发现当我在上面的命令 运行 中 admin.py 正在从 celery 导入 current_app 但它正在查找错误的文件

所以为了解决这个错误,我使用了相对导入并在导入语句前添加了 .. 但它仍然不起作用

# admin.py file in the django_celery_beat lib
from ..celery import current_app
from ..celery.utils import cached_property

现在我得到 ValueError: attempted relative import beyond top-level package

我已经尝试了一些 sys.path 黑客攻击,但糟糕的是,我仍然被困在这里。

我也检查了所有这些问题并尝试了那里提供的解决方案。

beyond top level package error in relative import

Sibling package imports

Relative imports for the billionth time

How to do relative imports in Python?

Attempted relative imports beyond top-level package?

您的错误可能与 celery.current_app 有点不包含在您的 PYTHONPATH 中有关。确保满足这两项:

  1. 确保 celery.current_app 软件包安装在 PYTHONPATH 下的某个位置。
  2. 如果您使用的是虚拟环境,请确保安装了 celery 并激活了您的虚拟环境。

我找到了解决这个问题的方法。正如我提到的,问题是我的主应用程序中的文件同名,因为文件名是 celery.py 当我 运行 django_celery_beat 它在我的内部寻找 current_app自定义 celery.py 文件,所以我按照@cagrias 的建议将文件名更改为 my_task.py。

我在下面的命令中附加了应用程序名称,现在可以使用了。

celery -A my_backend.task worker --loglevel=info