Celery 'module' object has no attribute 'app' when using Python 3

匿名 (未验证) 提交于 2019-12-03 08:57:35

问题:

I am going through Celery tutorial. They are using Python2 and I am trying to implement the same using python3.

I have 2 files:

celery_proj.py :

from celery import Celery  app = Celery(     'proj', broker='amqp://', backend='amqp://', include=['proj.tasks'])  app.conf.update(Celery_TAST_RESULT_EXPIRES=3600,)  if __name__ == '__main__':     app.start() 

and tasks.py :

from celery_proj import app   @app.task def add(x, y):     return x + y   @app.task def mul(x, y):     return x * y   @app.task def xsum(numbers):     return sum(numbers) 

When I try to run celery -A proj worker -l info I am getting :

Traceback (most recent call last):   File "/usr/local/lib/python3.4/dist-packages/celery/app/utils.py", line 235, in find_app     found = sym.app AttributeError: 'module' object has no attribute 'app'  During handling of the above exception, another exception occurred:  Traceback (most recent call last):   File "/usr/local/bin/celery", line 11, in <module>     sys.exit(main())   File "/usr/local/lib/python3.4/dist-packages/celery/__main__.py", line 30, in main     main()   File "/usr/local/lib/python3.4/dist-packages/celery/bin/celery.py", line 81, in main     cmd.execute_from_commandline(argv)   File "/usr/local/lib/python3.4/dist-packages/celery/bin/celery.py", line 769, in execute_from_commandline     super(CeleryCommand, self).execute_from_commandline(argv)))   File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 309, in execute_from_commandline     argv = self.setup_app_from_commandline(argv)   File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 469, in setup_app_from_commandline     self.app = self.find_app(app)   File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 489, in find_app     return find_app(app, symbol_by_name=self.symbol_by_name)   File "/usr/local/lib/python3.4/dist-packages/celery/app/utils.py", line 240, in find_app     found = sym.celery AttributeError: 'module' object has no attribute 'celery' 

What am I doing wrong and how to fix this?

回答1:

If you're using Python 3, you can use absolute imports via: from __future__ import absolute_import

Here's a sample celery.py from a recent Python 3, Django 1.7 app of mine:

from __future__ import absolute_import  import os import django  from celery import Celery from django.conf import settings   # set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings') django.setup()  app = Celery('my_app') app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 


回答2:

I've been playing around and have understood one interesting thing. When we run celery -A proj worker -l info we basically run proj folder. I belive that when you run proj folder celery looks for celery.py file there. It was OK in python2 as we used absolute imports and could write from proj.celery import ... but in python3 here is no such a possibility, we need to write from celery import ... and this will cause an error as celery is a module, so we need to rename celery.py to something else and when we do this we can't run proj no more. Maybe I am wrong but at least I made it work...

What you need to do is open proj directory and run tasks.py from there, then you will be able to use from celery_proj import app and keep celery_proj.

Please write if I am mistaken and add your solutions.



回答3:

When you run Celery with celery -A proj worker

AttributeError: 'module' object has no attribute 'app' ... AttributeError: 'module' object has no attribute 'celery' 

tell you that it tries to find:

a) app instance

b) proj.celery module

So you can either add from celery_proj import app to __init__.py or rename your celery_proj.py to celery.py.

Or you can run Celery as celery -A proj.celery_proj worker

I found the answer here as no answer here on stackoverflow had helped me.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!