Рабочий Celery для отладки VSCode

После нескольких разочаровывающих дней мне нужно посмотреть на отладку рабочего процесса сельдерея в VSCode. Это соответствует предложенному процессу в документах Celery для создания обработчика сообщений, а не публикации/подписки из того же приложения.

Файл celery.py:

from __future__ import absolute_import, unicode_literals
import os
import json

from celery import Celery, bootsteps
from kombu import Consumer, Exchange, Queue

dataFeedQueue = Queue('statistical_forecasting', Exchange('forecasting_event_bus', 'direct', durable=False), 'DataFeedUpdatedIntegrationEvent')

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')

app = Celery('statistical_forecasting')
app.config_from_object('django.conf:settings', namespace='CELERY')

# Not required yet as handler is within this file
#app.autodiscover_tasks()


class DataFeedUpdatedHandler(bootsteps.ConsumerStep):
    def get_consumers(self, channel):
        return [Consumer(channel, queues=[dataFeedQueue],    callbacks=[self.handle_message], accept=['json'])]


def handle_message(self, body, message):
    event = json.loads(body)

    # removed for brevity, but at present echo's message content with print

    message.ack()

app.steps['consumer'].add(DataFeedUpdatedHandler)

Моя сокращенная структура проекта:

workspace -
    vscode -
        - launch.json
    config -
        __init__.py            
        settings -
            local.py
    venv -
        celery.exe
    statistical_forecasting -
        __init__.py
        celery.py
        farms -
            __init__.py
            handlers.py    # ultimately handler code should live here...

С терминала с venv enable я запускаю celery -A statistical_forecasting worker -l info, который, похоже, успешно настраивает и запускает базовый обработчик сообщений.

До сих пор я пробовал с VSCode настроить следующую конфигурацию в launch.json

{
    "version": "0.2.0",
    "configurations": [
    {
        "name": "Python: Celery",
        "type": "python",
        "request": "launch",
        "module": "celery",
        "console": "integratedTerminal",
        //"program": "${workspaceFolder}\\env\\Scripts\\celery.exe",
        "args": [
            "worker",
            "-A statistical_forecasting",
            "-l info",
            ]
        },
    ]
}

К сожалению, это просто приводит к следующему сообщению:

Error:
Unable to load celery application.
The module  statistical_forecasting was not found.

Логически я могу предположить, что отладка должна выполняться celery из каталога рабочей области и что он должен видеть каталог statistical_forecasting с техническим __init__.py, что делает его модулем?

Я пробовал другие различные идеи, такие как форсирование виртуальной среды program в lauch.json и т. д., но все они возвращались с одним и тем же основным сообщением об ошибке.

'init.py' в статистическом_прогнозировании содержит стандартную настройку Django, и я не уверен, что она требуется, поскольку задача celery выполняется вне Django, и я не собираюсь публиковать/получать из Django заявление.


person Ross Halliday    schedule 29.08.2019    source источник
comment
Я думаю, что каждый 10-й вопрос django + сельдерея на SO касается модуля, который не найден... Что обычно решается путем правильной настройки PYTHONPATH или аналогичного. Эти ошибки не имеют ничего общего с сельдереем или django, но то, как вы запускаете программное обеспечение...   -  person DejanLekic    schedule 29.08.2019
comment
виновен как предъявлено обвинение :-( проблема здесь заключается в том, где его нужно установить ... VSCode должен подбирать PYTHONPATH, DJANGO_SETTINGS_MODULE теоретически должен подхватываться в коде ... CamelCasing в примерах должен выдавать, что я Я в первую очередь разработчик C#, поэтому, пожалуйста, будьте добры :-)   -  person Ross Halliday    schedule 29.08.2019
comment
Я бы с радостью помог, но я не использую django и вообще избегаю вопросов о django+celery, так как они довольно часто касаются настройки среды django. Если вы получаете сообщение об ошибке, что модуль не найден, это обычно означает, что ваш интерпретатор Python работает в неправильном каталоге. Конечно, установка PYTHONPATH в папку, где находится Statistics_forecasting.py, может помочь, но это также может сломать какой-то другой код...   -  person DejanLekic    schedule 29.08.2019
comment
не беспокойтесь, я попробую настроить пути по-другому в VsCode, чтобы посмотреть, поможет ли это обнаружить модуль. Спасибо за комментарий; Переполнение стека иногда похоже на крик в пустоту, когда никто не слушает.   -  person Ross Halliday    schedule 29.08.2019
comment
@DejanLekic это было форматирование аргументов! см. ответ ниже.   -  person Ross Halliday    schedule 29.08.2019


Ответы (1)


Для всех, кто пытается это сделать, вот моя минимальная конфигурация для тестирования сельдерея как модуля.

    {
        "name": "Python: Celery",
        "module": "celery",
        "console": "integratedTerminal",
        "args": [
            "worker",
            "--app=statistical_forecasting",
            "--loglevel=INFO",
        ],
    },

Идентификатор ключа, как форматируются аргументы. В оригинале использовались сокращенные версии, которые вы обычно видите при запуске из командной строки, например, в учебниках.

Обычно вы видите celery -A statistical_forecasting worker -l info для работы отладчика, вам нужна более полная версия celery --app=statistical_forecasting worker --loglevel=INFO.

Отражая комментарии ниже, он также работает как:

    {
        "name": "Python: Celery",
        "module": "celery",
        "console": "integratedTerminal",
        "args": [
            "worker",
            "-A",
            "statistical_forecasting",
            "-l",
            "info",
        ],
    },

Из интереса более длинная версия была следующей, но в основном это просто повторяет то, что VsCode установит по умолчанию:

    {
        "name": "Python: Celery",
        "type": "python",
        "request": "launch",
        "module": "celery",
        "console": "integratedTerminal",
        "cwd": "${workspaceFolder}",
        "program": "${workspaceFolder}\\env\\Scripts\\celery.exe",
        "pythonPath": "${config:python.pythonPath}",
        "args": [
            "worker",
            "--app=statistical_forecasting",
            "--loglevel=INFO",
        ],
        "env":{
            "DJANGO_SETTINGS_MODULE": "config.settings.local",
        }
    },
person Ross Halliday    schedule 29.08.2019
comment
Я думаю, что причина, по которой --app=blabla работает для вас, заключается в том, что при использовании -A вам нужны два отдельных элемента в массиве args. Это тоже должно работать: args: [worker, -A, Statistics_Forecasting, --loglevel=INFO] - person DejanLekic; 29.08.2019
comment
Конечно!!!, он передает аргументы в виде массива. Я тоже обновил ответ для этого. - person Ross Halliday; 29.08.2019