В 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
тоже не могу уследить.