2013-11-12 3 views
32

я прошел через этот пример здесь:Django, ImportError: не может импортировать имя Celery, возможно круговое импортирование?

http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

Все мои задачи в файлах, называемых tasks.py.

После обновления не сельдерей и добавление файла из примера Джанго бросает следующее сообщение об ошибке, независимо от того, что я пытаюсь:

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 
+0

предоставьте полную информацию о трассировке, а не только последнюю строку – alko

+0

@ user1252307 Пожалуйста, отметьте свой ответ как принятый. – dhilipsiva

ответ

44

Добавление следующие строки в облако/celery.py:

import celery 
print celery.__file__ 

дал мне сам файл, а не сельдерей модуль из библиотеки. После переименования celery.py в celeryapp.py и настройки импорта все ошибки исчезли.

Примечание:

Это приводит к изменению начиная работник:

celery worker --app=cloud.celeryapp:app 

Для тех, кто работает сельдерей == 3.1.2 и получает эту ошибку:

TypeError: unpack_from() argument 1 must be string or read-only buffer, not memoryview 

применить патч, упомянутый здесь: https://github.com/celery/celery/issues/1637

+14

И не забудьте удалить скомпилированное облако/celery.pyc в каталоге. Если нет, вы получите ошибку. – scum

+3

Я видел эту точную ошибку, я не понимаю, почему нужно переименовывать файл при использовании 'from __future__ import absolute_import', но это то, что я сделал. – cerberos

+0

@scum Спасибо за Heads-Up. – dhilipsiva

0

У меня такая же ошибка.

Кажется, что from __future__ import absolute_import НЕ работает для Python 2.6.1, все еще не поднимая ошибку.

Обновлено до Python 2.7.5, и оно просто сработало.

2

Для тех, кто хочет знать, что причиной этой ошибки:
У меня есть решить эту проблему только сейчас, то я нашел проблему --- 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) 

Он искал бы в Питона lib и site-packages первым. Отлично.

1

Обратите внимание, что старые проекты Django имеют сценарий manage.py в том же каталоге, что и каталог проекта. То есть, структура выглядит следующим образом:

- 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, как предложено в принятый ответ выше.

27

С 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, как описано в First Steps with Django. Вместо этого я переименовал proj/proj/celery.py в proj/proj/celery_tasks.py, а затем изменил содержимое __init__.py на соответствие: from .celery_tasks import app as celery_app. Не более нескольких экземпляров файлов с именем celery.py, чтобы вызвать беспорядок импорта, казалось, было более простым подходом.

+1

Это именно то, что я сделал, чтобы устранить путаницу как кода, так и самого себя. – Esteban

+0

Выше работал для меня в django 1.8, но я оставил 'от __future__ import absolute_import' там, и он работал нормально. Хотя я также должен был «rm * .pyc» и перезапустить dev-сервер. – Banjer

+0

У меня была такая же ошибка и немного другое впечатление. В PyCharm 2017.2 я начал получать ошибки о том, что импорт не работает. Оказывается, это потому, что я запустил PyCharm с командой charm в командной строке ... плохая идея. Эта командная строка наследуется от среды оболочки, а на оболочке я сделал свой Python 3.6 по умолчанию и 'PYTHONPATH' просочился в мой проект Python2 в PyCharm. Решение заключается в запуске PyCharm вне терминала, и мои проблемы ушли. – berto

1

У меня такая же ошибка. Оказывается, была проблема с моей версией 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.

Надеюсь, это поможет! :)

5

Работайте со мной (некоторая ошибка после развертывания на сервере): Удалите все * .pyc файлы из проекта и перезапустите его.

Смежные вопросы