【问题标题】:importing current_app from celery is gives ValueError: attempted relative import beyond top-level package从 celery 导入 current_app 会给出 ValueError:尝试相对导入超出顶级包
【发布时间】:2019-12-24 09:25:21
【问题描述】:

是的,我知道堆栈溢出有很多与此值错误相关的类似问题,我尝试了所有解决方案,但由于我是 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 用于周期性任务,因此我在主应用程序 my_backend 中添加了一个 celery.py 文件。

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

# 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 hack,但我的错,我仍然被困在这里。

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

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?

【问题讨论】:

    标签: python django celery django-celery celerybeat


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,让我试试您的解决方案,会尽快回复您
    • 不,仍然是同样的问题,如果我只是重命名我的自定义 celery.py 文件并执行相同的命令,一切正常。问题是当 python 尝试在 admin.py 文件中加载模块时,它正在查看我的自定义 celery.py 文件,而不是 env/lib/celery 模块。
    • 为什么选择将文件命名为celery.py?这令人困惑且不安全。
    • 是的,我知道这一点,我一直在关注这个网站进行 celery 安装,所以我使用了它。 realpython.com/asynchronous-tasks-with-django-and-celery
    • 添加 celery 任务的常用方法是命名tasks.py。查看他们的官方教程docs.celeryproject.org/en/latest/getting-started/…
    【解决方案2】:

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

    我在下面的命令中附加了应用名称,它现在可以工作了。

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

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2021-10-03
      • 2020-11-03
      • 2017-02-22
      • 1970-01-01
      • 2018-12-05
      • 2020-04-06
      相关资源
      最近更新 更多