これは私が実行しているコードです:
from __future__ import absolute_import
from celery import Celery
celery1 = Celery('celery',broker='amqp://',backend='amqp://',include=['tasks'])
celery1.conf.update(
CELERY_TASK_RESULT_EXPIRES=3600,
)
if __name__ == '__main__':
celery1.start()
上記のコードを実行すると、次のエラーが発生します。
ImportError: cannot import name Celery
私も同じエラーに遭遇し、ファイル名を変更して修正しました。
これに遭遇した他の誰にとっても、この問題が発生する理由、ローカルのcelery.pyが実際のセロリパッケージの代わりにインポートされるため、理由python ca n't find Celery(capital " C ")、セロリパッケージ内のクラスと同じですが、Celeryクラスが内部に定義されていないローカルのcelery.pyであるcelery(小文字の" c ")を検出します。
ローカルのcelery.pyの名前を_celery.pyに変更しましたが、celery.py以外の名前で問題が解決するはずです。
編集:celery.pyファイルが置かれているディレクトリの外でceleryデーモンを呼び出すことも同様に機能することを言及するつもりでした。テストの目的では、ファイルの名前を変更するだけで十分ですが、ローカルファイル名としてcelery.pyを使用できます。たとえば、次のフォルダ構造が与えられたとします。
+ root/ -proj/ * celery.py * tasks.py
ルートフォルダからセロリを呼び出すと、次のように入力できるはずです。
celery worker --app=proj [optional args]
「-l info」オプションのログ引数を使用し、イントロデータのすぐ下にある[タスク]リストを表示して、タスクが存在することを確認できます。
詳細はこちらのチュートリアルドキュメントにあります: http://docs.celeryproject.org/en/latest/getting-started/next-steps.html#about-the-app-argument
私はpycharmとユニットテストと一緒にこの問題を抱えていたので、さらに回答を追加したいと思います。私はpython 3でテストしましたが、以前のバージョンでfrom __future__ import absolute_import
を使用すると同じことが起こると想定しています。
根本的な原因はpycharmバグレポート https://youtrack.jetbrains.com/issue/PY-15889 に記載されています
概要:pycharmでユニットテストを実行する場合、テストスクリプトを含むフォルダーは常にsys.path
の開始に追加されます。 celery.py
が同じパスにある場合、pythonは最初にそれをロードしようとします。
ファイル名を変更する代わりに、sys.path
テストスクリプトにcelery.py
をインポートする前に、このフォルダーを..._Test.py
から削除して解決しました。
# If running in pycharm, pycharm always adds the current path to the beginning (!) of sys.path
# I have not found a setting to fix this - so I just remove the path again
# This block can be removed once https://youtrack.jetbrains.com/issue/PY-15889 if fixed
import sys
import os
sys.path.remove(os.path.dirname(__file__))
import celery
プロジェクトディレクトリ内のcelery.py
ファイルの名前を変更してもこのエラーが引き続き発生する場合は、celery.pyc
ファイルも削除してください。