Django,导入错误:无法导入名称芹菜,可能的循环导入



我在这里浏览了这个例子:

http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

我所有的任务都在名为 tasks.py 的文件中。

更新芹菜并从示例 django 添加文件后,无论我尝试什么,都会抛出以下错误:

ImportError: cannot import name Celery

问题是否可能由以下原因引起?

app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')

因为它会遍历所有具有以下导入 tasks.py 文件。

from cloud.celery import app

云/芹菜.py

from __future__ import absolute_import
import os, sys
from celery import Celery
from celery.schedules import crontab
from django.conf import settings
BROKER_URL = 'redis://:PASSWORD@localhost'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cloud.settings')
app = Celery('cloud', broker=BROKER_URL)
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')
if "test" in sys.argv:
    app.conf.update(
        CELERY_ALWAYS_EAGER=True,
    )
    print >> sys.stderr, 'CELERY_ALWAYS_EAGER = True'
CELERYBEAT_SCHEDULE = {
    'test_rabbit_running': {
        "task": "retail.tasks.test_rabbit_running",
        "schedule": 3600, #every hour
    },
    [..]
app.conf.update(
    CELERYBEAT_SCHEDULE=CELERYBEAT_SCHEDULE
)

零售/任务.py

from cloud.celery import app
import logging
from celery.utils.log import get_task_logger
logger = get_task_logger('tasks')
logger.setLevel(logging.DEBUG)
@app.task
def test_rabbit_running():
    import datetime
    utcnow = datetime.datetime.now()
    logger.info('CELERY RUNNING')

当我尝试访问无效的 url 时,会发生错误,例如/foobar。

以下是完整的回溯

Traceback (most recent call last):
  File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 126, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 255, in __call__
    response = self.get_response(request)
  File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 178, in get_response
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
  File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 220, in handle_uncaught_exception
    if resolver.urlconf_module is None:
  File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 342, in urlconf_module
    self._urlconf_module = import_module(self.urlconf_name)
  File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/opt/src/slicephone/cloud/cloud/urls.py", line 52, in 
    urlpatterns +=  patterns('', url(r'^search/', include('search.urls')))
  File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 25, in include
    urlconf_module = import_module(urlconf_module)
  File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/opt/src/slicephone/cloud/search/urls.py", line 5, in 
    from handlers import SearchHandler
  File "/opt/src/slicephone/cloud/search/handlers.py", line 15, in 
    from places import handlers as placeshandler
  File "/opt/src/slicephone/cloud/places/handlers.py", line 23, in 
    import api as placesapi
  File "/opt/src/slicephone/cloud/places/api.py", line 9, in 
    from djapi import *
  File "/opt/src/slicephone/cloud/places/djapi.py", line 26, in 
    from tasks import add_single_place, add_multiple_places
  File "/opt/src/slicephone/cloud/places/tasks.py", line 2, in 
    from cloud.celery import app
  File "/opt/src/slicephone/cloud/cloud/celery.py", line 4, in 
    from celery import Celery
  File "/opt/src/slicephone/cloud/cloud/celery.py", line 4, in 
    from celery import Celery
ImportError: cannot import name Celery

将以下行添加到云/芹菜.py:

import celery
print celery.__file__

给了我文件本身,而不是库中的芹菜模块。将 celery.py 重命名为 celeryapp.py 并调整导入后,所有错误都消失了。

注意:

这会导致启动工作线程的变化:

celery worker --app=cloud.celeryapp:app

对于那些运行芹菜==3.1.2并收到此错误的人:

TypeError: unpack_from() argument 1 must be string or read-only buffer, not memoryview

应用此处提到的修补程序:https://github.com/celery/celery/issues/1637

使用 Django 1.7.5、Celery 3.1.17 和 Python 2.7.6,我发现我仍然得到这些ImportError: cannot import name Celery。但仅在 PyCharm 4.0.4 下运行测试时。

我发现解决方案不是依赖 Django 的第一步中所述的from __future__ import absolute_import相反,我将proj/proj/celery.py重命名为proj/proj/celery_tasks.py,然后更改了__init__.py的内容以匹配:from .celery_tasks import app as celery_app。不再有多个名为 celery.py 的文件实例导致导入混乱似乎是一种更简单的方法。

得到同样的错误

我的芹菜

设置文件名(celery.py)与"芹菜"包冲突...

所以在做这个 - 从芹菜进口芹菜>, 它引发了错误 - 无法导入名称芹菜

解决方案->只需将"celery.py"更改为"celery-settings.py"之类的其他内容

> 2022 年 10 月,importlib-metadata==5.0.0 发布。在 python 3.7 中,这会破坏当前版本的 celery 使用的kombu==5.2.4(请参阅问题 #1600)。

固定importlib-metadata==4.13.0或其他低于 5 的版本,或更新到 python 3.8。

为我工作(在服务器中部署后的一些错误):从项目中删除所有 *.pyc 文件并重新启动他。

您是否添加了以下行:

from __future__ import absolute_import

到您的cloud/celery.py模块的顶部?

在此处阅读示例的细分:http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

对于想知道导致此错误的原因的人
我刚才遇到了这个问题,然后我---sys.path发现了问题。
也许你像我一样向 sys.path 添加了一些路径,我在 manage.py 中添加了下面的代码,

ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
SRC_PATH = os.path.join(ROOT_PATH, 'src')
CONF_PATH = os.path.join(ROOT_PATH, 'conf')
sys.path.insert(0, SRC_PATH)
sys.path.insert(0, CONF_PATH)

所以,from celery import Celery会在SRC_PATH搜索芹菜,然后先CONF_PATH,这就是问题所在。

更改为

sys.path.append(SRC_PATH)
sys.path.append(CONF_PATH)

它会在python的lib中搜索并首先site-packages。完美解决。

我遇到了同样的错误。事实证明,我的芹菜版本有问题。我升级到 3.1,此版本(http://celery.readthedocs.org/en/latest/whatsnew-3.1.html)现已弃用芹菜。所以我不得不降级到版本 3.0.19,这是该项目使用的先前稳定版本,到目前为止效果很好。

    pip install celery==3.0.19

无论如何,如果你不想降级,3.1 版本中芹菜的替代品是芹菜工人。查看此处了解更多信息:http://celery.readthedocs.org/en/latest/userguide/workers.html。

希望这有帮助! :)

我遇到了类似的问题:从芹菜进口芹菜导入错误:无法从"芹菜"导入名称"芹菜"

解决此问题的另一种简单方法:如果您的软件包在 celery.py 中具有芹菜配置,这就是它导致问题的原因。将其重命名为 celery_settings.py<</p>

div class="one_answers">

请注意,较旧的 Django 项目的 manage.py 脚本与项目目录位于同一目录中。也就是说,结构如下所示:

- proj/
  - proj/__init__.py
  - proj/celery.py
  - proj/urls.py
  - proj/manage.py
  - proj/settings.py

取而代之的是:

- proj/
  - proj/__init__.py
  - proj/celery.py
  - proj/settings.py
  - proj/urls.py
- manage.py

在这种情况下,您只需将celery.app文件重命名为其他名称,例如上面接受的答案中建议的celeryapp.py

我在Python 3.7上运行的FastAPI应用程序上遇到了同样的问题。这个线程中的任何解决方案都不适合我。我通过将 Python 升级到 3.8 来解决我的应用程序上的问题。

如果上述错误,即 ImportError: cannot import name 'Celery' from 'celery' (/usr/local/airflow/.local/lib/python3.7/site-packages/celery/__init__.py)即将到来,python版本被用作3.7.*,然后由于importlib-metadata库中的错误,因为它的最新版本。

因此,要解决上述问题,请在python依赖项列表中使用此版本:

  • pip install importlib-metadata==4.13.0

或者,如果您使用 Docker 文件来构建项目,请将 python 版本从 3.7 更改为 3.8,它应该可以正常工作。

对我来说,它奏效了。请使用以下链接查看详细信息:

Django_celery_python_3.7_问题

我得到了同样的错误。

似乎from __future__ import absolute_import不适用于 Python 2.6.1,仍然没有引发错误。

升级到Python 2.7.5,它就可以工作了。

在我的django应用程序中,我遇到了同样的错误。版本姜戈 4,芹菜 5。我的问题是我从带有文件 celery.py 的目录运行 Celery,但必须从带有 manage.py 的目录中运行 Celery。斯拉瓦乌克兰语!

相关内容

  • 没有找到相关文章

最新更新