web-dev-qa-db-fra.com

Django, ImportError: impossible d'importer le nom Céleri, possible importation circulaire?

J'ai parcouru cet exemple ici:

http://docs.celryproject.org/en/latest/Django/first-steps-with-Django.html

Toutes mes tâches sont dans des fichiers appelés tasks.py.

Après avoir mis à jour le céleri et ajouté le fichier de l'exemple Django lance l'erreur suivante, peu importe ce que j'essaie:

ImportError: cannot import name Celery

Le problème est-il probablement causé par les éléments suivants?

app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')

Parce qu'il passe par tous les fichiers tasks.py qui ont tous l'importation suivante.

from cloud.celery import app

cloud/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://:PASSWORD@localhost'

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
)

retail/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')

L'erreur se produit lorsque j'essaie d'accéder à une URL non valide, comme/foobar.

Voici le traçage complet :

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
41
kev

Ajout des lignes suivantes à cloud/celery.py:

import celery
print celery.__file__

m'a donné le fichier lui-même et non le module céleri de la bibliothèque. Après avoir renommé celery.py en celeryapp.py et ajusté les importations, toutes les erreurs ont disparu.

Remarque:

Cela conduit à un changement dans le démarrage du travailleur:

celery worker --app=cloud.celeryapp:app

Pour ceux qui exécutent céleri == 3.1.2 et obtiennent cette erreur:

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

Appliquez le patch mentionné ici: https://github.com/celery/celery/issues/1637

54
kev

Avec Django 1.7.5, Celery 3.1.17 et Python 2.7.6 j'ai constaté que je recevais toujours ces ImportError: cannot import name Celery. Mais uniquement lors de l'exécution de tests sous PyCharm 4.0.4.

J'ai trouvé qu'une solution était de ne pas s'appuyer sur from __future__ import absolute_import comme décrit dans Premiers pas avec Django . Au lieu de cela, j'ai renommé proj/proj/celery.py à proj/proj/celery_tasks.py puis a changé le contenu de __init__.py correspondre: from .celery_tasks import app as celery_app. Plus d'instances multiples de fichiers nommés celery.py pour semer la confusion dans les importations semblait être une approche plus simple.

41
jwd630

Avez-vous ajouté la ligne:

from __future__ import absolute_import

en haut de votre cloud/celery.py module?

Lisez la répartition de l'exemple ici: http://docs.celryproject.org/en/latest/Django/first-steps-with-Django.html

7
asksol

a la même erreur

mon nom de fichier de paramètres de céleri qui était (celery.py) était en conflit avec le package "céleri" ...

donc en faisant cela-> à partir du céleri, importez du céleri, cela génère une erreur - ne peut pas importer le nom de céleri

solution-> il suffit de changer le 'celery.py' en quelque chose d'autre comme 'celery-settings.py'

7
PRASHANT VERMA

Travaillez pour moi (un bug après le déploiement sur le serveur): supprimez tous les fichiers * .pyc du projet et redémarrez-le.

6
Dmitriy Yusupov

J'ai eu la même erreur. Il s'avère qu'il y avait un problème avec ma version Celery. J'ai mis à niveau vers 3.1 et celeryd est désormais obsolète pour cette version ( http://celery.readthedocs.org/en/latest/whatsnew -3.1.html ). J'ai donc dû rétrograder vers la version 3.0.19 qui était la version stable précédente utilisée pour le projet, et cela fonctionne bien jusqu'à présent.

    pip install celery==3.0.19

Quoi qu'il en soit, si vous ne voulez pas rétrograder, le remplacement de celeryd dans la version 3.1 est celery worker . Vérifiez ici pour plus d'informations: http://celery.readthedocs.org/en/latest/userguide/workers.html .

J'espère que cela t'aides! :)

3
Emily

Pour quelqu'un qui veut savoir quelle est la cause de cette erreur:
J'ai rencontré ce problème tout à l'heure, puis j'ai trouvé le problème --- sys.path.
Peut-être que vous ajoutez un chemin vers sys.path comme moi, j'ajoute ci-dessous le code dans 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)

donc, from celery import Celery rechercherait le céleri dans SRC_PATH et CONF_PATH d'abord, c'est le problème.

changer pour

sys.path.append(SRC_PATH)
sys.path.append(CONF_PATH)

Il chercherait d'abord dans lib et site-packages De python. Résolu parfaitement.

2
Mithril

Notez que les anciens projets Django ont le manage.py script dans le même répertoire que le répertoire du projet. Autrement dit, la structure ressemble à ceci:

- proj/
  - proj/__init__.py
  - proj/celery.py
  - proj/urls.py
  - proj/manage.py
  - proj/settings.py

au lieu de cela:

- proj/
  - proj/__init__.py
  - proj/celery.py
  - proj/settings.py
  - proj/urls.py
- manage.py

Dans ce cas, il vous suffit de renommer le celery.app fichier vers quelque chose de différent, comme celeryapp.py comme suggéré dans la réponse acceptée ci-dessus.

1
Jordan Reiter

J'ai eu la même erreur.

Semble que from __future__ import absolute_import NE FONCTIONNE PAS pour Python 2.6.1, ne génère toujours pas d'erreur.

Mise à niveau vers Python 2.7.5 et cela a juste fonctionné.

0
alanjds