使用 Django / virtualenv 运行 celery 时找不到“__main__”模块

Posted

技术标签:

【中文标题】使用 Django / virtualenv 运行 celery 时找不到“__main__”模块【英文标题】:Can't find '__main__' module when running celery with Django / virtualenv 【发布时间】:2019-08-27 09:44:49 【问题描述】:

Debian 9.8 虚拟环境 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 personnelcelery beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler,它按预期工作。我的应用程序的名称是“人员”。

有几个相关的问题,但与我的完全不一样。这是我尝试各种命令时发生的情况。

celery worker 在 venv 处于活动状态的项目目录中启动 worker 并看起来像文档显示的那样(redis 正在工作,beat 也可以)

/home/www/personnel/venv/bin/python 在 venv 未激活的情况下从 proj 目录外部将我放入 shell,我可以在其中导入 Celery 而不会出错

来自项目外部的/home/www/personnel/venv/bin/celery 向我展示了 celery 帮助(用法:celery [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
|--...

从项目目录中它按预期工作,但我无法让它在外部工作或与主管一起成功启动。

编辑

#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.

【问题讨论】:

我不明白你正在尝试的命令。为什么不只是/home/www/personnel/venv/bin/celery worker /home/www/personnel/venv/bin/python celery worker?基本上我不明白你为什么要添加额外的/home/www/personnel @DanielRoseman 很可能只是因为我对事情的运作方式不太了解:(只是在谷歌搜索时尝试我在建议中找到的内容。我会将结果添加为顶部的编辑跨度> 【参考方案1】:

使用主管时,它适用于:

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

directory=/home/www/personnel

从命令行尝试时它不起作用,可能是因为它需要可访问的 Django 设置。

【讨论】:

以上是关于使用 Django / virtualenv 运行 celery 时找不到“__main__”模块的主要内容,如果未能解决你的问题,请参考以下文章

从 django 应用程序调用 unoconv 的问题,在 virtualenv 中运行

在 apache 上的不同 virtualenv 中运行多个 django 项目

Git post-recieve hook 来运行 virtualenv、Django 和各种 python 脚本

无法在 virtualenv 中导入 django,但在停用时可以工作

【Python入门】37.常用第三方模块之 创建虚拟环境virtualenv

通过主管监督 virtualenv django 应用程序