私はここでこの例を試しました:
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
cloud/celery.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
)
retail/tasks.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')
/ foobarのような無効なURLにアクセスしようとすると、エラーが発生します。
ここに完全なトレースバックがあります:
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
Cloud/celery.pyに次の行を追加します。
import celery
print celery.__file__
ライブラリのセロリモジュールではなく、ファイル自体を提供してくれました。 celery.pyの名前をceleryapp.pyに変更し、インポートを調整すると、すべてのエラーがなくなりました。
注意:
これにより、ワーカーの起動が変更されます。
celery worker --app=cloud.celeryapp:app
Celery == 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
に依存するnotであることがわかりました。代わりに、proj/proj/celery.py
の名前をproj/proj/celery_tasks.py
に変更し、__init__.py
の内容をfrom .celery_tasks import app as celery_app
に一致するように変更しました。インポートの混乱を引き起こすcelery.py
という名前のファイルの複数のインスタンスは、より単純なアプローチであると思われました。
次の行を追加しましたか:
from __future__ import absolute_import
あなたのcloud/celery.py
モジュール?
ここの例の内訳を読んでください: http://docs.celeryproject.org/en/latest/Django/first-steps-with-Django.html
同じエラーが発生しました
(celery.py)であったセロリ設定ファイル名が 'celery'パッケージと競合していました...
そのため、これを実行中->セロリからセロリをインポートすると、エラーが発生しました-名前セロリをインポートできません
解決策->「celery.py」を「celery-settings.py」などの別のものに変更するだけです
私のために働く(サーバーにデプロイした後のいくつかのバグ):プロジェクトからすべての* .pycファイルを削除し、彼を再起動します。
同じエラーが発生しました。私のCeleryバージョンに問題があったことがわかりました。 3.1にアップグレードし、celerydはこのバージョンでは非推奨になりました( 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 。
お役に立てれば! :)
このエラーの原因を知りたい人向け:
たった今この問題に遭遇したのですが、問題が見つかりました--- 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
を最初に検索します。完全に解決しました。
古い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
などの別の名前に変更する必要があります。
同じエラーが発生しました。
のようだ from __future__ import absolute_import
Python 2.6.1では動作しませんが、エラーは発生しません。
Python 2.7.5にアップグレードし、機能しました。