ImportError: cannot import name 'get_rule_detail' from 'jira_plug.utils.rule' (D:\code\ido-jira-plug\IdoJiraPlug\jira_plug\utils\rule.py)

Мой проект Django имеет проблему при запуске

Это мой проект,

IdoJiraPlug
    - jira_plug
        - __init__.py
        - api
            __init__.py
            config.py
        - serializers
            __init__.py
            request_serializer.py
        - utils
            __init__.py
            rule.py
        - urls.py
    - manage.py

jira_plug.utils.__init__.py

from .rule import *

jira_plug.utils.rule.py

...
from jira_plug.serializers import RuleConfigInfoSerializer
...

jira_plug.serializers.__init__.py

from .request_serializer import *

jira_plug.serializers.request_serializer.py

...
from jira_plug.utils import JiraAction, get_msg_data, get_rule_detail, handle_message_content
...

Мне кажется, что это происходит потому, что rule.py и request_serializer.py импортируют друг друга, но я не знаю истинной причины. Я пытаюсь использовать 'from jira_plug.utils.rule import get_rule_detail, handle_message_content', но все равно возникает эта ошибка.

В вашем jira_plug приложении в utils.py файле нет get_rule_detail класса или функции или имени переменной.

Если вы уверены, что он существует - попробуйте проверить каждую букву в имени в utils.py, возможно, вы найдете ошибку.

Я решил эту проблему.Настоящая причина - циркулярный импорт.Когда django стартует, urls.py будет использоваться import_module().python начнет загружать модуль шаг за шагом согласно jira_plug.urls.py.

  1. jira_plug.urls.py, 5 строка: from . import api, тогда python загрузит jira_plug.api.__init__.py модуль.
  2. jira_plug.api.__init__.py, 3 строка: from .config import *, затем python загрузит jira_plug.api.config.py module.
  3. jira_plug.api.config.py, 5 строка: from jira_plug.utils import JiraAction, затем python загрузит jira_plug.utils.__init__.py module.
  4. jira_plug.utils.__init__.py, 6 строка: from .rule import *, затем python загрузит jira_plug.utils.rule.py module.
  5. jira_plug.utils.rule.py, 4 строка: from jira_plug.serializers import RuleConfigInfoSerializer, тогда python загрузит jira_plug.serializers.__init__.py module.
  6. jira_plug.serializers.__init__.py, 4 строка: from .request_serializer import *, затем python загрузит jira_plug.serializers.request_serializer.py module.
  7. jira_plug.serializers.request_serializer.py, 6 строка: from jira_plug.utils import JiraAction, get_msg_data, get_rule_detail, handle_message_content, тогда python будет загружать jira_plug.utils пакет.
Ответ 陈俊汝 для ImportError: cannot import name 'get_rule_detail' from 'jira_plug.utils.rule' (D:\code\ido-jira-plug\IdoJiraPlug\jira_plug\utils\rule.py)

Лучшим решением будет абстрагирование общего пакета.

Временным решением является изменение jira_plug.api.config.py.

# from jira_plug.utils import JiraAction
from jira_plug.utils.call_jira import JiraAction

Это приведет к тому, что после шага 3 все исчезнет. Но это скрытая опасность, мне уже придется абстрагировать общие методы. Это решение - просто пример!

Вернуться на верх