Ошибка Python ImportError, которая меня озадачила (уже искал похожие посты на stackoverflow, но безуспешно)
Я создаю API с помощью django ninja, по соображениям дизайна я использую некоторую логику внутри microservice/logic/one_module.py, которая должна получать JSON данные из microservice/service/repository.py
Вот структура моего проекта:
| .coveragerc
| manage.py
| pytest.ini
|
+---microservice
| asgi.py
| models.py
| settings.py
| urls.py
| wsgi.py
| __init__.py
|
+---logic
| config.py
| correlate.py
| correlation_rules.py
| generate_ticket.py
| send_ticket.py
| startup.py <--------- Code is being executed here
| temp.py
| __init__.py
|
|
+---service
| | application.py
| | domain.py
| | repository.py <--------- Data is here (must be imported)
| | __init__.py
| |
| +---schemas
| | application.py
| | domain.py
| | repository.py
| | __init__.py
| |
| +---tests
| | test_application.py
| | test_domain.py
| | test_logic.py
| | test_repository.py
| | __init__.py
| |
| +---json
| alert_1.json
| client_1.json
| secrets_1.json
|
+---static
| logo.png
| script.js
| styles.css
|
+---templates
base.html
email.html
В файле service/repository.py у меня есть:
json_call = requests.get(...etc...)
clients, alerts, secrets = ...comprehension to get the data as dict...
В файле logic/startup.py у меня есть:
from microservice.service.repository import clients, secrets, alerts
clients = ...some code using the data...
Запустив его таким образом, он выдает ошибку:
Traceback (most recent call last):
File "...windows_path...\Projects\Correlator\microservice\microservice\logic\startup.py", line 1, in <module>
from microservice.service.repository import clients, secrets, alerts
ModuleNotFoundError: No module named 'microservice'
VSCode находит его просто отлично, однако я могу также попробовать относительный импорт:
from ..service.repository import clients, secrets, alerts
clients = ...some code using the data...
Запустив его таким образом, он выдает ошибку:
Traceback (most recent call last):
File "...windows_path...\Projects\Correlator\microservice\microservice\logic\startup.py", line 1, in <module>
from ..service.repository import clients, secrets, alerts
ImportError: attempted relative import with no known parent package
VSCode тоже находит его без проблем. Он также корректно перенаправляет на __init__.py при попытке проверить его в IDE. Я скопирую сообщение print(sys.path), чтобы вы знали, что с ним происходит.
['...windows_path...\\Projects\\Correlator\\microservice\\microservice\\logic', '...windows_path...\\AppData\\Local\\Programs\\Python\\Python312\\python312.zip', '...windows_path...\\AppData\\Local\\Programs\\Python\\Python312\\DLLs', '...windows_path...\\AppData\\Local\\Programs\\Python\\Python312\\Lib', '...windows_path...\\AppData\\Local\\Programs\\Python\\Python312', '...windows_path...\\Projects\\Correlator\\venv', '...windows_path...\\Projects\\Correlator\\venv\\Lib\\site-packages']
Попытка использовать sys.path.append (я хочу избежать этого любой ценой, я знаю, что написание кода импорта в __init__.py может быть решением) тоже не работает, я вставлю код и traceback.
import sys
import pathlib
import os
print("CWD WITH OS --->",os.getcwd())
sys.path.append(str(pathlib.WindowsPath().cwd()))
print("PYTHONPATH ---> ", sys.path)
from microservice.service.repository import clients, secrets, alerts
CWD WITH OS ---> ...windows_path...\Projects\Correlator\microservice\microservice\logic
PYTHONPATH ---> ['...windows_path...\\Projects\\Correlator\\microservice\\microservice\\logic', '...windows_path...\\AppData\\Local\\Programs\\Python\\Python312\\python312.zip', '...windows_path...\\AppData\\Local\\Programs\\Python\\Python312\\DLLs', '...windows_path...\\AppData\\Local\\Programs\\Python\\Python312\\Lib', '...windows_path...\\AppData\\Local\\Programs\\Python\\Python312', '...windows_path...\\Projects\\Correlator\\venv', '...windows_path...\\Projects\\Correlator\\venv\\Lib\\site-packages'], '...windows_path...\\Projects\\Correlator\\microservice\\microservice\\logic']
Traceback (most recent call last):
File "...windows_path...\Projects\Correlator\microservice\microservice\logic\startup.py", line 1, in <module>
from microservice.service.repository import clients, secrets, alerts
ModuleNotFoundError: No module named 'microservice'
Я пытался сделать test-A.py и test-B.py с foo() и var:int внутри /logic и /service, но та же проблема, не удалось решить. Честно говоря, я не знаю, что вызывает ошибку, возможно, это особенность Django, в каждой директории есть пустой __init__.py
Большое спасибо за помощь, я действительно видел 8-10 сообщений на StackOverflow, но некоторые из них были разными, а некоторые вообще не решали проблему