web-dev-qa-db-ja.com

Django、ImportError:名前Celeryをインポートできません、循環インポートが可能ですか?

私はここでこの例を試しました:

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
41
kev

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

54
kev

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という名前のファイルの複数のインスタンスは、より単純なアプローチであると思われました。

41
jwd630

次の行を追加しましたか:

from __future__ import absolute_import

あなたのcloud/celery.pyモジュール?

ここの例の内訳を読んでください: http://docs.celeryproject.org/en/latest/Django/first-steps-with-Django.html

7
asksol

同じエラーが発生しました

(celery.py)であったセロリ設定ファイル名が 'celery'パッケージと競合していました...

そのため、これを実行中->セロリからセロリをインポートすると、エラーが発生しました-名前セロリをインポートできません

解決策->「celery.py」を「celery-settings.py」などの別のものに変更するだけです

7
PRASHANT VERMA

私のために働く(サーバーにデプロイした後のいくつかのバグ):プロジェクトからすべての* .pycファイルを削除し、彼を再起動します。

6
Dmitriy Yusupov

同じエラーが発生しました。私の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

お役に立てれば! :)

3
Emily

このエラーの原因を知りたい人向け
たった今この問題に遭遇したのですが、問題が見つかりました--- 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を最初に検索します。完全に解決しました。

2
Mithril

古い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などの別の名前に変更する必要があります。

1
Jordan Reiter

同じエラーが発生しました。

のようだ from __future__ import absolute_import Python 2.6.1では動作しませんが、エラーは発生しません。

Python 2.7.5にアップグレードし、機能しました。

0
alanjds