web-dev-qa-db-fra.com

Céleri de départ: AttributeError: l'objet 'module' n'a pas d'attribut 'céleri'

J'essaie de démarrer un serveur de serveur Celery à partir d'une ligne de commande:

celery -A tasks worker --loglevel=info

Le code dans tasks.py:

import os
os.environ[ 'Django_SETTINGS_MODULE' ] = "proj.settings"

from celery import task

@task()
def add_photos_task( lad_id ):
...

Je reçois la prochaine erreur:

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 8, in <module>
    load_entry_point('celery==3.0.12', 'console_scripts', 'celery')()
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/__main__.py", line 14, in main
    main()
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/celery.py", line 946, in main
    cmd.execute_from_commandline(argv)
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/celery.py", line 890, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 177, in execute_from_commandline
    argv = self.setup_app_from_commandline(argv)
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 295, in setup_app_from_commandline
    self.app = self.find_app(app)
  File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 313, in find_app
    return sym.celery
AttributeError: 'module' object has no attribute 'celery'

Est-ce que quelqu'un sait pourquoi l'attribut 'céleri' ne peut pas être trouvé? Merci pour l'aide.

Le système d'exploitation est Linux Debian 5.

Modifier . Peut être l'indice. Quelqu'un pourrait-il m'expliquer le commentaire suivant à une fonction (pourquoi nous devons être sûrs qu'elle trouve des modules dans le répertoire actuel)?

# from celery/utils/imports.py
def import_from_cwd(module, imp=None, package=None):
    """Import module, but make sure it finds modules
    located in the current directory.

    Modules located in the current directory has
    precedence over modules located in `sys.path`.
    """
    if imp is None:
        imp = importlib.import_module
    with cwd_in_path():
        return imp(module, package=package)
15
sergzach

J'ai oublié de créer un objet céleri dans tasks.py:

from celery import Celery
from celery import task  

celery = Celery('tasks', broker='amqp://guest@localhost//') #!

import os

os.environ[ 'Django_SETTINGS_MODULE' ] = "proj.settings"

@task()
def add_photos_task( lad_id ):
...

Après cela, nous pourrions normalement commencer des tâches:

celery -A tasks worker --loglevel=info
21
sergzach

Le céleri utilise le fichier celery pour enregistrer la configuration de votre application. Vous ne pouvez pas simplement donner un fichier python avec des tâches et démarrer le céleri. Vous devez définir le fichier celery (pour Celery> 3.0; c'était auparavant celeryconfig.py) ..

celeryd --app app.celery -l info

Cet exemple montre comment démarrer le céleri avec le fichier de configuration à app/celery.py

Voici un exemple de fichier de céleri: https://github.com/Kami/libcloud-sandbox/blob/master/celeryconfig.py

8
Rustem

Si vous recevez le même message d'erreur pour une raison apparemment différente, notez que si l'une des importations de votre fichier d'initialisation échoue, votre application déclenche cette AttributeError totalement ambiguë plutôt que l'exception qui l'a initialement provoquée.

4
kellanburket

Lorsque vous exécutez celery -A tasks worker --loglevel=info, votre application de céleri devrait être exposée dans le module tasks. Il ne devrait pas être encapsulé dans une fonction ou dans une instruction if qui.

Si vous make_celery dans un autre fichier, vous devez importer l'application de céleri dans votre fichier que vous transmettez au céleri.

1
Chuma Umenze

Essayez de commencer le céleri:

celeryd --config=my_app.my_config --loglevel=INFO --purge -Q my_queue

Il y a le prochain script dans mon tasks.py:

@task(name="my_queue", routing_key="my_queue")
def add_photos_task( lad_id ):

Il y a le prochain script dans my_config.py:

CELERY_IMPORTS = \
(
    "my_app.tasks",
)
CELERY_ROUTES = \
{
    "my_queue":
    {
        "queue": "my_queue"
    },
}
CELERY_QUEUES = \
{
    "my_queue":
    {
        "exchange": "my_app",
        "exchange_type": "direct",
        "binding_key": "my_queue"
    },
}
celery = Celery(broker='amqp://guest@localhost//')
1
Evgenii

Mon problème était que j'ai mis la variable celery dans une fonction principale:

if __== '__main__':  # Remove this row
    app = Flask(__name__)
    celery = make_celery(app) 

quand il devrait être mis à l'extérieur.

0
Philip Bergström