我正在阅读Celery教程。他们正在使用Python2,我正在尝试使用python3实现相同的功能。
我有2个文件:
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()
和 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)
当我尝试运行celery -A proj worker -l info
时,我得到了:
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'
我做错了什么以及如何解决这个问题?
答案 0 :(得分:3)
如果您使用的是Python 3,则可以通过以下方式使用绝对导入:from __future__ import absolute_import
以下是我最近的Python 3,Django 1.7应用程序中的示例celery.py
:
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)
答案 1 :(得分:3)
使用celery -A proj worker
AttributeError: 'module' object has no attribute 'app'
...
AttributeError: 'module' object has no attribute 'celery'
告诉你它试图找到:
a)app
实例
b)proj.celery
模块
因此,您可以将from celery_proj import app
添加到__init__.py
,也可以将celery_proj.py
重命名为celery.py
。
或者您可以将Celery作为celery -A proj.celery_proj worker
我找到了答案here,因为stackoverflow上的答案没有帮助我。
答案 2 :(得分:2)
我一直在玩,并且理解了一件有趣的事情。
当我们运行celery -A proj worker -l info
时,我们基本上运行proj
文件夹。我相信,当你运行proj
文件夹时,芹菜会在那里查找celery.py
文件。在python2中没关系,因为我们使用绝对导入并且可以写from proj.celery import ...
但是在python3中没有这种可能性。我们需要编写from celery import ...
这会导致错误,因为celery
是一个模块,因此我们需要将celery.py重命名为其他内容。当我们这样做时,我们无法再运行proj
。也许我错了,但至少我让它成功了......
您需要做的是打开proj
目录并从那里运行tasks.py,然后才能使用from celery_proj import app
并保留celery_proj
。
如果我弄错了,请写信并添加您的解决方案。
答案 3 :(得分:0)
在docker容器中运行celery和django应用程序时,我遇到了同样的问题。看起来celery worker命令在当前目录中搜索celery应用。从任意目录运行命令时,会出现此属性未找到错误。但是,当它从django应用程序目录(可以在其中找到应用程序/模块)运行时,celery worker将按预期运行。
答案 4 :(得分:0)
当我为主项目目录和应用程序目录提供相同的名称时,我遇到了一个与docker奇怪的情况。
更正我解决的卷中已解决问题的路径(-./app:/app)检查docker部分中的celery配置部分。
-app:
..
app:
__init__.py
celery.py
初始化 .py
from __future__ import absolute_import
from .celery import app as celery_app
__all__ = ['celery_app']
celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')
app = Celery('app')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
因此,我必须在音量部分提供正确的路径
celery:
build: .
command: celery -A app worker -l info
volumes:
- ./app:/app
depends_on:
- db
- redis