ImportError:无法导入名称芹菜

时间:2016-11-06 06:52:42

标签: python flask celery

我正在尝试使用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.pycelery_worker中的任何一项时遇到上述错误。

请建议。

4 个答案:

答案 0 :(得分:4)

您的导入逻辑不正确并导致循环依赖。不要在app.py中初始化celery并引用模块(accounts),而模块又导入celery实例。

您有几种选择:

  1. 从app.py模块

  2. 的应用accounts中删除相关性
  3. 将celery初始化对象放入共享模块中,该模块不引用任何其他模块,但由/*/tasks.py子模块引用。

  4. 不要在任务中导入芹菜,而是使用shared_task装饰器。有关详细信息,请参阅doc

  5. 重要提示:不要忘记将芹菜应用程序正确链接到@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)

tasks.py

from myapp.app import celery

https://docs.python.org/3.5/tutorial/modules.html#packages

答案 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