Когда я запускаю воркера, использующего Django и Celery, используя эту команду (я выполняю команду в каталоге d):
celery -A e.project.celery:app worker -l info
File "/Users/.../..../e/venv/lib/python2.7/site-packages/celery-4.2.0-py2.7.egg/celery/loaders/base.py", line 108, in import_default_modules
raise response
ImportError: No module named project.urls
Я использую Django 1.11 и Celery 4.2 с Python 2.7.
Ниже представлена структура моего проекта с содержимым некоторых файлов, которые могут быть полезны при отладке.
Структура Django:
d/
__init__.py
e/
__init__.py
core/
__init__.py
app1/
__init__.py
tasks.py
project/ (project stuff)
__init__.py
celery.py
settings.py
urls.py
context_processors.py
wsgi.py
manage.py
setup.py
settings.py:
INSTALLED_APPS = [
'...',
'django_celery_results',
'django_celery_beat'
]
CELERY_RESULT_BACKEND = 'django-db'
CELERY_BROKER_URL = 'redis://foo:[email protected]:6599/1'
CELERY_CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
e/project/__init__.py:
from __future__ import absolute_import, unicode_literals
from e.project.celery import app as celery_app
__all__ = ('celery_app', )
e/project/celery.py:
from __future__ import absolute_import, unicode_literals
import os
import sys
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "e.project.settings")
app = Celery('e_tasks')
# 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()
if __name__ == '__main__':
app.start()
d/e/core/app1/tasks.py:
from celery import shared_task
@shared_task
def hello_world_task():
print('Hello world')
Мой файл manage.py:
#!/usr/local/bin/python2.7
import os
import sys
if __name__ == "__main__":
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'e'))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "e.project.settings")
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)
Нет, я никогда не помещал project в INSTALLED_APPS. Все мое приложение Django отлично работает без него. Зачем мне это туда ставить? Возможно, я сделаю другой каталог для истории celery.py, если это так.
@AAA у вас странная структура проекта. У вас есть настройки в manage.py? '...' в INSTALLED_APPS - это ваш настоящий код или вы просто сократили его перед вставкой сюда?
... - это аббревиатура перед вставкой сюда. Я скопирую и вставлю свой файл manage.py в OP.
Я только что вставил свой файл manage.py. Может быть, это деталь os.path.append?
Попробуйте PYTHONPATH=$PWD/e celery -A e.project.celery:app worker -l info
Я вижу, что вы используете e.project.celery и e.project.settings, но ошибка говорит о том, что не удается найти project.urls (в начале нет e.). Как вы определили настройку ROOT_URLCONF?
@Ralf Это действительно была проблема, ой! Если вы ответите на вопрос, я приму ваш ответ и награду вас наградой. Спасибо!






Как указано в комментариях к вопросу, я вижу, что вы используете e.project.celery и e.project.settings в своих операторах импорта, но ошибка говорит о том, что не удается найти project.urls (в начале нет e.).
Как вы определили настройку ROOT_URLCONF? Может быть, в этом проблема.
INSTALLED_APPSсодержит'project'?