我有一个带有Celery 3.1.25的Django 1.11项目,其布局如下:
env
myproject
myapp
myotherapp
settings
settings.py
__init__.py
celery_init.py
我的__init__.py
包含:
from .celery_init import app as celery_app
我的celery_init.py
包含:
from __future__ import absolute_import
import os
import sys
import traceback
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.settings')
from django.conf import settings
app = Celery('myproject')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
当我开始当地的芹菜工人进行开发测试时,使用:
env/bin/celery worker -A myproject -l info -n sr@%h -Q somequeue
失败,但例外情况是:
ImportError: No module named myapp
造成这种情况的原因是什么?我认为它有一些路径问题而无法正确加载我的项目设置,但我没有看到配置问题。我刚升级到Django 1.11,这些设置在之前的版本中运行良好。我做错了什么?
我尝试在celery_init.py
的末尾添加print语句,以确保它能够加载所有内容,并且每行都可以正确完成。
答案 0 :(得分:0)
问题结果是缺少初始化Django的sys.path问题。工作celery_init.py
看起来像:
from __future__ import absolute_import
import os
import sys
from celery import Celery
import django
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.settings')
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../myproject')))
django.setup()
from django.conf import settings
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
答案 1 :(得分:0)
我正在关注一个教程(我是celery的新手),并且在其中运行“任务”应用的命令为:
subs(A, x = 2);
但这对我不起作用; 仅此有效(颠倒some_app和worker的顺序)
celery -A worker some_app -l info
第二个代码似乎更有意义,但我不确定为什么第一个代码对本教程中的那个人有用,但对我却不起作用...除非该代码在较旧的版本中可用,而不在我的版本中有效有。
答案 2 :(得分:0)
我有同样的问题。 我解决了将--workdir参数放到manage.py所在的目录中。 我现在正在使用芹菜4.4.0