импорт current_app из сельдерея дает ValueError: попытка относительного импорта за пределами пакета верхнего уровня

Да, я знаю, что есть много подобных вопросов о переполнении стека, связанных с этой ошибкой значения, и я пробовал все решения из них, но, поскольку я новичок в Django и python, я не могу решить эту проблему.

У меня есть один проект с именем my_backend, который имеет следующую файловую структуру.

main_project/
   cmb_backend/
        __init__.py
        celery.py
        urls.py
    second_app/
        __init__.py
        moduleZ.py
    my_env/
       bin/
       include/
       lib/
         python 3.7/
           site-packages/
             celery/
             django_celery_beat
               admin.py

Я использовал сельдерей для периодической задачи, поэтому я добавил один файл celery.py в свое основное приложение my_backend.

Я также установил django_celery_beat с помощью pip, и внутри него они импортировали сельдерей, используя приведенный ниже код.

# admin.py file in the django_celery_beat lib
from celery import current_app
from celery.utils import cached_property

поэтому, когда я запускаю эту команду

python3 my_backend/setup_database.py

это дает мне ошибку, как

ImportError: cannot import name 'current_app' from 'celery' (/Users/pankaj/Desktop/Pankaj/MyJangoProjects/My_Project/my_backend/celery.py)

поэтому из этой ошибки я обнаружил, что когда я запускаю команду выше, admin.py импортирует current_app из сельдерея, но ищет не тот файл

поэтому, чтобы решить эту ошибку, я использую относительный импорт и добавляю .. перед оператором импорта, но все же он не работает

# admin.py file in the django_celery_beat lib
from ..celery import current_app
from ..celery.utils import cached_property

Теперь здесь я получаю ValueError: attempted relative import beyond top-level package

Я пробовал взломать sys.path, но, к сожалению, я все еще застрял здесь.

Я также проверил все эти вопросы и попробовал решения, которые там представлены.

за пределами ошибки пакета верхнего уровня при относительном импорте

Импорт одноуровневых пакетов

Относительный импорт в миллиардный раз

Как сделать относительный импорт в Python?

Попытка относительного импорта за пределы пакета верхнего уровня?


person Pankaj K.    schedule 19.08.2019    source источник


Ответы (2)


Ваша ошибка, вероятно, связана с тем, что celery.current_app несколько не включен в ваш PYTHONPATH. Убедитесь, что эти два пункта удовлетворены:

  1. Убедитесь, что пакет celery.current_app установлен где-то под вашим PYTHONPATH.
  2. Если вы используете виртуальную среду, убедитесь, что celery установлен и ваша виртуальная среда активирована.
person cagrias    schedule 19.08.2019
comment
спасибо за ответ, позвольте мне попробовать ваше решение и свяжусь с вами - person Pankaj K.; 19.08.2019
comment
Нет, все та же проблема, все работает нормально, если я просто переименую свой собственный файл celery.py и выполню ту же команду. проблема в том, что когда python пытается загрузить модуль в файл admin.py, он просматривает мой собственный файл celery.py, а не модуль env/lib/celery. - person Pankaj K.; 19.08.2019
comment
Почему вы решили назвать свой файл celery.py? Это сбивает с толку и небезопасно. - person cagrias; 19.08.2019
comment
да, я узнал об этом, я следил за этим сайтом для установки сельдерея, поэтому я использовал его. realpython.com/asynchronous-tasks-with-django-and-celery - person Pankaj K.; 19.08.2019

Я нашел решение этой проблемы. Как я уже упоминал, проблема заключалась в том же имени файла в моем основном приложении, так как имя файла было celery.py, когда я запускал django_celery_beat, он искал current_app внутри моего пользовательского файла celery.py, поэтому я изменил имя файла на my_task .py, как предложил @cagrias.

Я добавил имя приложения в приведенную ниже команду, и теперь оно работает.

celery -A my_backend.task worker --loglevel=info
person Pankaj K.    schedule 19.08.2019