我正在尝试使用Celery + Redis + Flask运行一些后台作业。
我的应用结构是:
myapp/
celery_worker.py
manage.py
myapp/
__init__.py
app.py
bot/
__init__.py
tasks.py
accounts/
views.py
我将芹菜初始化为app.py:
celery = Celery('tasks', include=['bot.tasks'])
def create_app(config=None, app_name=None, blueprints=None):
# more Celery and other config here like celery.conf.update()
按celery_worker.py
from myapp import create_app, celery
app = create_app()
app.app_context().push()
tasks.py
包含
from myapp import celery
@celery.task(name='my_task_bot')
def my_task_bot():
# pass
现在,当我尝试使用以下导入从tasks.py访问accounts / views.py中的任务时:
from ..bot.tasks import my_task_bot
我收到ImportError: cannot import name celery
错误。
无论我在哪里尝试导入任务,我都会收到此错误。此celery
实例似乎是在app.py中初始化的实例,但未导入。
PS:我正在关注https://github.com/ezequielo/flask_celery_exp repo的模式,它运行正常。但不是我的应用程序。
修改
这是Traceback:
Traceback (most recent call last):
File "manage.py", line 8, in <module>
from myapp import create_app
File "/home/mars/myapp/myapp/__init__.py", line 3, in <module>
from app import create_app, celery
File "/home/mars/myapp/myapp/app.py", line 18, in <module>
from .accounts import (accounts, AccountsAdmin)
File "/home/mars/myapp/myapp/accounts/__init__.py", line 7, in <module>
from .views import accounts
File "/home/mars/myapp/myapp/accounts/views.py", line 6, in <module>
from ..bot.tasks import my_task_bot
File "/home/mars/myapp/myapp/bot/tasks.py", line 14, in <module>
from myapp import celery
ImportError: cannot import name celery
Fatal error: local() encountered an error (return code 1) while executing 'python manage.py initdb'
我在尝试启动manage.py
或celery_worker
中的任何一项时遇到上述错误。
请建议。
答案 0 :(得分:4)
您的导入逻辑不正确并导致循环依赖。不要在app.py中初始化celery并引用模块(accounts
),而模块又导入celery
实例。
您有几种选择:
从app.py模块
accounts
中删除相关性
将celery初始化对象放入共享模块中,该模块不引用任何其他模块,但由/*/tasks.py
子模块引用。
不要在任务中导入芹菜,而是使用shared_task
装饰器。有关详细信息,请参阅doc
重要提示:不要忘记将芹菜应用程序正确链接到@shared_tasks。应该在任何任务之前加载Celery应用程序。因此,在celery.py中定义celery初始化,然后将其加载到myapp/__init__.py
。
from __future__ import absolute_import
from .celery import app as celery_app # noqa
或者,您可以详细说明此link。它显示了与芹菜应用程序一起组织烧瓶应用程序的好方法。
答案 1 :(得分:2)
答案 2 :(得分:1)
在初始化Celery的文件中,将其添加为第一行。
from __future__ import absolute_import
解释
from __future__ import absolute_import
意味着如果您导入celery,Python将寻找顶级芹菜模块,而不是current_package.celery。这应该可以解决您遇到的错误。但要确保芹菜是
安装。很高兴提到芹菜必须安装。这适用于
python版本晚于2.6
答案 3 :(得分:0)
我解决此错误取消选中&#39;将内容根添加到python路径&#39;并且“将灵魂根添加到python路径中”#39;在pycharm