В Celery/Django: не удается найти ссылку 'control' в celery.task.control

Я пытаюсь использовать сельдерей в моем проекте. когда я использую from celery.task.control import revoke основной момент PyCharm 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']

3 ответа

Решение

Обычно это происходит, когда вы используете одну виртуальную среду Python (или только локальный Python) в своем PyCharm, а другую среду Python для своего сотрудника Celery. Если вы правильно установите Celery в среде, используемой PyCharm, вы не увидите этого предупреждения.

Если в среде, в которой вы хотите запустить своего сотрудника Celery, правильно установлен Celery, у вас все будет в порядке, и вы можете игнорировать предупреждение PyCharm, но я рекомендую установить Celery в среду вашего проекта PyCharm, чтобы воспользоваться преимуществами кода PyCharm. анализ и т.д...

Модуль 'control' находится в celery.app, а не в celery.task . Импортировать 'revoke' так, как вы его настроили, не получится.

Я наткнулся на то же самое сегодня, и мне тоже стало интересно.

Давайте сначала докажем, что это работает:

      $ 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! Но импорт работает. Что мы импортируем тогда?

Используя эту информацию, можно проверить, что мы импортировали. Продолжение сеанса выше:

      >>> 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.pyиcelery/task/controlне существует, это должно произойти вcelery/task/__init__.py. Я не совсем уверен, как это работает, но подозреваю, что здесь задействованы LazyModule, Proxy и recreate_module. Покопайтесь в этом файле, если хотите узнать больше.

Чтобы ответить на ваш вопрос, PyCharm, вероятно, добавит ломаную строку подrevokeи предупреждает васUnresolved reference revokeпотому что он не может следовать нестандартной настройке импорта, которую разработал сельдерей. Мойpylintтоже не могу уследить.

Другие вопросы по тегам