Не удается найти модуль '__main__' при запуске сельдерея с Django / virtualenv - PullRequest
0 голосов
/ 05 апреля 2019

Debian 9.8
virtualenv 16.4.3
Python 3.5.3
Django 2.1.7
сельдерей 4.3.0
django-celery-beat 1.4.0

Когда я запускаю команды celery из моего каталога приложений с активным venv, например, celery worker -A personnel или celery beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler, это работает, как и ожидалось.Мое приложение называется «персонал».

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

celery worker из каталога проекта с активным venv запускает рабочий и выглядит так, как показано в документации (redis работает, beat работает)

/home/www/personnel/venv/bin/python снаружи proj dir с неактивным venv бросает меня в оболочку, где я могу импортировать Celery без ошибок

/home/www/personnel/venv/bin/celery извне proj показывает мне помощь сельдерея (использование: сельдерей[options] ...)

/home/www/personnel/venv/bin/python /home/www/personnel celery worker, который из моего исследования показывает, что должно работать, возвращает: /home/www/personnel/venv/bin/python: can't find '__main__' module in '/home/www/personnel'

Вышеприведенная ошибка возвращается даже с флагом -A.

/home/www/personnel/venv/bin/python /home/www/personnel/manage.py celery worker возвращает:

Unknown command: 'celery'
Type 'manage.py help' for usage.

Журнал стандартного вывода показывает те же ошибки.Я предполагаю, что команда должна сработать до того, как начальник войдет в игру.

Я начал с нуля и воссоздал venv с тем же результатом.

# __init__.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ['celery_app']
# celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
#from celery.schedules import crontab

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'personnel.settings')

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


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
; ==================================
; celery worker config
; ==================================

[program:celery]
; full path using virtualenv
command=/home/www/personnel/venv/bin/python /home/www/personnel celery worker -A personnel -I info

directory=/home/www/personnel
;user=dunnoyet
numprocs=1
stderr_logfile=/var/log/celery.out.log
stdout_logfile=/var/log/celery.err.log
autostart=true
autorestart=true
startsecs=10

; need to wait for currently executing tasks to finish at shutdown
; increase if long running tasks
stopwaitsecs = 600

; send the termination signal (SIGTERM) to the whole process group
stopasgroup=true

; set Celery priority higher than default (999)
; so, if rabbitmq is supervised, it will start first
priority=1000
# Project structure based on django cookie cutter
pr_project
|--personnel
   |--api/
   |--...
   |--__init__.py
   |--celery.py
   |--urls.py
   |--views.py
   |--wsgi.py
|--requirements
|--...

Из каталога проекта он работает, как и ожидалось, но я не могу получитьчтобы он работал снаружи или успешно запускался с супервизором.

edit

#personnel/settings.py
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'

Как я и предлагал, я попытался /home/www/personnel/venv/bin/celery worker - он запускается, но, похоже, не может подключиться кredis

[2019-04-05 09:18:11,960: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.

С флагом приложения /home/www/personnel/venv/bin/celery worker -A personnel:

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

1 Ответ

0 голосов
/ 05 апреля 2019

При использовании супервизора он работает с:

[program:celery]
; full path using virtualenv
command=/home/www/personnel celery worker

directory=/home/www/personnel

Он не будет работать при попытке из командной строки, возможно, потому что ему нужны доступные настройки Django.

...