Подтвердить что ты не робот

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
4b9b3361

Ответ 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 файлы из проекта и перезапустите его.

Ответ 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, и он просто сработал.