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
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
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.
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
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'
Travaillez pour moi (un bug après le déploiement sur le serveur): supprimez tous les fichiers * .pyc du projet et redémarrez-le.
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! :)
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.
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.
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é.