Django, ImportError: не может импортировать имя Celery, возможный циклический импорт?
Я рассмотрел этот пример здесь:
http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
Все мои задачи находятся в файлах под названием tasks.py.
После обновления сельдерея и добавления файла из примера django бросает следующую ошибку, независимо от того, что я пытаюсь:
ImportError: cannot import name Celery
Возможно, проблема связана с следующим?
app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')
Потому что он проходит через все файлы tasks.py, все из которых имеют следующий импорт.
from cloud.celery import app
облако /celery.py
from __future__ import absolute_import
import os, sys
from celery import Celery
from celery.schedules import crontab
from django.conf import settings
BROKER_URL = 'redis://:[email protected]'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cloud.settings')
app = Celery('cloud', broker=BROKER_URL)
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')
if "test" in sys.argv:
app.conf.update(
CELERY_ALWAYS_EAGER=True,
)
print >> sys.stderr, 'CELERY_ALWAYS_EAGER = True'
CELERYBEAT_SCHEDULE = {
'test_rabbit_running': {
"task": "retail.tasks.test_rabbit_running",
"schedule": 3600, #every hour
},
[..]
app.conf.update(
CELERYBEAT_SCHEDULE=CELERYBEAT_SCHEDULE
)
розничный /tasks.py
from cloud.celery import app
import logging
from celery.utils.log import get_task_logger
logger = get_task_logger('tasks')
logger.setLevel(logging.DEBUG)
@app.task
def test_rabbit_running():
import datetime
utcnow = datetime.datetime.now()
logger.info('CELERY RUNNING')
Ошибка возникает, когда я пытаюсь получить доступ к URL-адресу, который недействителен, например /foobar.
Вот полная трассировка:
Traceback (most recent call last):
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 126, in handle_request
respiter = self.wsgi(environ, resp.start_response)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 255, in __call__
response = self.get_response(request)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 178, in get_response
response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 220, in handle_uncaught_exception
if resolver.urlconf_module is None:
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 342, in urlconf_module
self._urlconf_module = import_module(self.urlconf_name)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/opt/src/slicephone/cloud/cloud/urls.py", line 52, in
urlpatterns += patterns('', url(r'^search/', include('search.urls')))
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 25, in include
urlconf_module = import_module(urlconf_module)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/opt/src/slicephone/cloud/search/urls.py", line 5, in
from handlers import SearchHandler
File "/opt/src/slicephone/cloud/search/handlers.py", line 15, in
from places import handlers as placeshandler
File "/opt/src/slicephone/cloud/places/handlers.py", line 23, in
import api as placesapi
File "/opt/src/slicephone/cloud/places/api.py", line 9, in
from djapi import *
File "/opt/src/slicephone/cloud/places/djapi.py", line 26, in
from tasks import add_single_place, add_multiple_places
File "/opt/src/slicephone/cloud/places/tasks.py", line 2, in
from cloud.celery import app
File "/opt/src/slicephone/cloud/cloud/celery.py", line 4, in
from celery import Celery
File "/opt/src/slicephone/cloud/cloud/celery.py", line 4, in
from celery import Celery
ImportError: cannot import name Celery
Ответы
Ответ 1
Добавление следующих строк в cloud/celery.py:
import celery
print celery.__file__
дал мне сам файл, а не модуль сельдерея из библиотеки. После переименования celery.py в celeryapp.py и настройки импорта все ошибки исчезли.
Примечание:
Это приводит к изменению начального рабочего:
celery worker --app=cloud.celeryapp:app
Для тех, кто работает celery == 3.1.2 и получает эту ошибку:
TypeError: unpack_from() argument 1 must be string or read-only buffer, not memoryview
Примените патч, упомянутый здесь: https://github.com/celery/celery/issues/1637
Ответ 2
С Django 1.7.5, Celery 3.1.17 и Python 2.7.6 я обнаружил, что все еще получаю эти ImportError: cannot import name Celery
. Но только при выполнении тестов в PyCharm 4.0.4.
Я обнаружил, что решение не полагаться на from __future__ import absolute_import
, как описано в Первые шаги с Django. Вместо этого я переименовал proj/proj/celery.py
в proj/proj/celery_tasks.py
, а затем изменил содержимое __init__.py
, чтобы он соответствовал: from .celery_tasks import app as celery_app
. Не более нескольких экземпляров файлов с именем celery.py
, чтобы вызвать путаницу импорта, казалось, было более простым подходом.
Ответ 3
Работайте для меня (некоторая ошибка после развертывания на сервере):
Удалите все *.pyc файлы из проекта и перезапустите его.
Ответ 4
Вы добавили строку:
from __future__ import absolute_import
в верхней части вашего модуля cloud/celery.py
?
Прочитайте разбивку примера здесь:
http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
Ответ 5
Для тех, кто хочет знать причину этой ошибки:
Я встречаю эту проблему только сейчас, затем я нашел проблему --- sys.path.
Возможно, вы добавили некоторый путь к sys.path, как я, я добавляю ниже код в manage.py,
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
SRC_PATH = os.path.join(ROOT_PATH, 'src')
CONF_PATH = os.path.join(ROOT_PATH, 'conf')
sys.path.insert(0, SRC_PATH)
sys.path.insert(0, CONF_PATH)
поэтому from celery import Celery
будет искать сельдерей в SRC_PATH
и CONF_PATH
во-первых, что проблема.
измените на
sys.path.append(SRC_PATH)
sys.path.append(CONF_PATH)
Сначала он будет искать в python lib
и site-packages
. Отлично решено.
Ответ 6
Обратите внимание, что старые проекты Django имеют manage.py
script в том же каталоге, что и каталог проекта. То есть структура выглядит следующим образом:
- proj/
- proj/__init__.py
- proj/celery.py
- proj/urls.py
- proj/manage.py
- proj/settings.py
вместо этого:
- proj/
- proj/__init__.py
- proj/celery.py
- proj/settings.py
- proj/urls.py
- manage.py
В этом случае вам просто нужно переименовать файл celery.app
в нечто другое, например celeryapp.py
, как указано в принятом ответе выше.
Ответ 7
Я получил ту же ошибку. Оказывается, была проблема с моей версией Celery. Я обновил до 3.1 и celeryd теперь устарел для этой версии (http://celery.readthedocs.org/en/latest/whatsnew-3.1.html). Поэтому мне пришлось перейти на версию 3.0.19, которая была предыдущей стабильной версией, используемой для проекта, и пока она работает хорошо.
pip install celery==3.0.19
В любом случае, если вы не хотите понижать рейтинг, замена для celeryd в версии 3.1 - работник сельдерея. Проверьте здесь дополнительную информацию: http://celery.readthedocs.org/en/latest/userguide/workers.html.
Надеюсь, это поможет!:)
Ответ 8
У меня такая же ошибка.
Кажется, что from __future__ import absolute_import
НЕ работает для Python 2.6.1, все еще не поднимая ошибку.
Обновлен до Python 2.7.5, и он просто сработал.