在 Celery/Django 中:在 celery.task.control 中找不到引用'control'



我正在尝试在我的项目中使用芹菜。 当我使用from celery.task.control import revokePyCharm 突出显示control并警告我cannot find reference 'control' in __init__.py并且 PyCharm 在revoke下添加虚线并警告我Unresolved reference revoke.

但是当我运行项目时,芹菜工作得很好,在调用任务或撤销任务方面没有任何问题。我的问题是为什么 PyCharm 会警告我,将来是否有可能发生任何问题?

celery.py:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hamclassy.settings')
app = Celery('hamclassy')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

项目/__init__.py:

from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ['celery_app']

当您在 PyCharm 中使用一个 Python 虚拟环境(或只是本地 Python)而为您的 Celery worker 使用另一个 Python 环境时,通常会发生这种情况。如果您在 PyCharm 使用的环境中正确安装了 Celery,您将不会看到该警告。

只要您要在其中运行 Celery worker 的环境正确安装了 Celery,您就可以没事了,您可以忽略 PyCharm 警告,但我建议您在 PyCharm 项目的环境中也安装 Celery,以享受 PyCharm 代码分析等的好处......

"control"模块位于 celery.app 而不是celery.task。以您设置的方式导入"撤销"将不起作用。

我今天偶然发现了同样的事情,也很好奇。

让我们首先证明它有效:

$ mkdir tmp
$ cd tmp
$ python -m venv env
$ source env/bin/activate
$ pip install celery==4.4.7
$ python
Python 3.10.5 ...
Type "help", "copyright", "credits" or "license" for more information.
>>> from celery.task.control import revoke
>>> from celery.task.control import foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'foo' from 'control' (unknown location)

因此,我们可以清楚地从芹菜 4.4.7 中的celery.task.control导入revoke。它有效。

虽然如果你去寻找revoke()的定义,你不会在celery/task中找到它!但是导入有效。那我们在进口什么呢?

使用此信息可以检查我们导入的内容。继续上述会话:

>>> import inspect
>>> print(inspect.getsourcefile(revoke))
.../lib/python3.10/site-packages/celery/app/control.py

啊哈,所以revoke()是在celery/app/control.py中定义的.

但是我们进口了celery.task.control.它如何解决celery.app.control

由于celery/task/control.pycelery/task/control不存在,因此它必须发生在celery/task/__init__.py。我不完全确定它是如何工作的,但我怀疑 LazyModule、Proxy 和 recreate_module 都参与其中。如果您想了解更多信息,请深入研究此文件。

为了回答您的问题,PyCharm 可能会在revoke下添加一条虚线,并警告您Unresolved reference revoke因为它无法遵循芹菜设计的非标准导入设置。我的pylint也跟不上它。

相关内容

  • 没有找到相关文章

最新更新