【问题标题】:Celery import error芹菜导入错误
【发布时间】:2014-01-22 11:26:57
【问题描述】:

我在启动 celery 时遇到了导入错误。这令人困惑,因为几天前它还在工作,而 git 显示没有任何变化。我认为 celery 对导入目录的启发式与我的拆分设置结构相冲突,也许我的路径/环境与调用工作时不同?我应该如何调整我的调用或环境以帮助 celery 加载其所有下游进口?这是 Celery 3.1.7 和 Django 1.6。

我的调用:

celery worker --app=proj.proj

错误:

Traceback (most recent call last):
  File "/home/ben/.virtualenvs/proj/bin/celery", line 8, in <module>
    load_entry_point('celery==3.1.7', 'console_scripts', 'celery')()
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/__main__.py", line 30, in main
    main()
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/bin/celery.py", line 80, in main
    cmd.execute_from_commandline(argv)
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/bin/celery.py", line 723, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/bin/base.py", line 303, in execute_from_commandline
    return self.handle_argv(self.prog_name, argv[1:])
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/bin/celery.py", line 715, in handle_argv
    return self.execute(command, argv)
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/bin/celery.py", line 669, in execute
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/bin/worker.py", line 175, in run_from_argv
    return self(*args, **options)
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/bin/base.py", line 266, in __call__
    ret = self.run(*args, **kwargs)
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/bin/worker.py", line 208, in run
    state_db=self.node_format(state_db, hostname), **kwargs
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/worker/__init__.py", line 95, in __init__
    self.app.loader.init_worker()
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/loaders/base.py", line 128, in init_worker
    self.import_default_modules()
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/loaders/base.py", line 121, in import_default_modules
    tuple(maybe_list(self.app.conf.CELERY_INCLUDE))
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/loaders/base.py", line 103, in import_task_module
    return self.import_from_cwd(module)
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/loaders/base.py", line 112, in import_from_cwd
    package=package,
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/utils/imports.py", line 101, in import_from_cwd
    return imp(module, package=package)
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/celery/loaders/base.py", line 106, in import_module
    return importlib.import_module(module, package=package)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/ben/Projects/proj/proj/proj/matches/management/tasks/valve_api_calls.py", line 9, in <module>
    from matches.models import Match, LobbyType, GameMode,\
  File "/home/ben/Projects/proj/proj/proj/matches/models.py", line 1, in <module>
    from django.db import models
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/django/db/__init__.py", line 11, in <module>
    if settings.DATABASES and DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__
    self._setup(name)
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/ben/.virtualenvs/proj/local/lib/python2.7/site-packages/django/conf/__init__.py", line 134, in __init__
    raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'proj.settings.local' (Is it on sys.path?): No module named settings.local

我的项目如下:

proj <git root>
└──proj <project root>
   └── manage.py
   └── proj <project app>
       └── celery_app.py
       └── settings
           └── local.py

我的环境变量是:

DJANGO_SETTINGS_MODULE=proj.settings.local
DJANGO_PROJECT_DIR=/home/ben/Projects/proj/proj/proj

编辑:我正在使用 virtualenv,所以我在启动时的 $PATH 看起来像

PATH=/home/ben/.virtualenvs/proj/bin:
/usr/local/heroku/bin:/usr/lib/lightdm/lightdm:
/usr/local/sbin:/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:
/usr/games:
/usr/local/games

【问题讨论】:

  • 你为什么运行celery指向一个应用程序?此外,请注意您没有名为 proj.proj 的包
  • Celery 会进行一些应用程序自动发现,但可能需要帮助,具体取决于目录结构和文件名。在这种情况下,默认的“celery worker”调用会错过我的应用程序(及其配置)。指定 proj.proj 可以让 celery 找到应用程序,但堆栈跟踪显示任务中的导入链丢失了自动发现这些模块的上下文。
  • 你不能为每个应用只使用tasks.py吗?

标签: python django celery


【解决方案1】:

我的 virtualenv 不知何故损坏了。具有相同环境变量和已安装软件的新虚拟环境可以工作。

【讨论】:

    【解决方案2】:

    你的芹菜使用了错误的工作目录,所以找不到相对路径proj.settings.local

    尝试将您的设置修改为DJANGO_PROJECT_DIR=/home/ben/Projects/proj/proj,看看是否有效。

    【讨论】:

    • 尝试不同级别的 /proj/ 会产生相同的错误或发现问题(深度不足的规范错过了应用程序)。
    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多