티스토리 뷰
[lolupdates.gg] 동일 디렉토리의 패키지, 모듈 불러오기 에러, ModuleNotFoundError: No module named '__main__.mainApp; '__main__' is not a package 에러, django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. 에러
SUNO(수노) 2020. 3. 11. 13:38에러 잡는 과정을 정확히 기록한 게 아니라 기억에 의존해 작성한다.
문제 상황: parser.py에서 동일한 디렉터리에 있는 mainApp 패키지의 models.py를 불러오려고 할 때 생기는 에러
파이썬 패키지 원칙에 따르면 동일 디렉터리에 있는 패키지에서 모듈을 불러오는 경우 바로 from 패키지.모듈이 맞다.
그러나 에디터에서 에러가 있다고 한다.
참고) https://brownbears.tistory.com/296
mainApp앞에 .을 추가해
from .mainApp.models import TestModel
로 현재 디렉토리를 표시해주면 에디터가 패키지를 인식해서 자동 완성을 해준다.
그러나 실행하면 또 다른 에러가 난다.
ModuleNotFoundError: No module named '__main__.mainApp; '__main__' is not a package
해당 에러에 관한 StackOverFlow 질문
구글링하여 __init__.py 추가, 메타 클래스 추가, 절대 경로 추가 등을 해봤는데 계속해서 에러가 발생했다.
이것저것 시도해 보다가 mainApp앞에 상위 디렉토리인 ch3까지 명시해 보았다. ch3.mainApp.models
from ch3.mainApp.models import TestModel
이렇게 하면 에디터에서도 오류를 발견하지 못하고, 실행하면 새로운 에러가 뜬다.
(전략)
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
검색해보니 문제 상황이 다양했다. 알고 보니 django.setup()을 하지 않아 발생한 에러였다.
import만 하고 setup을 하지 않았던 것이다.
그런데 또 새로운 에러가 뜬다.
(전략)
RuntimeError: Conflicting 'TestModel' models in application 'mainApp': <class 'ch3.mainApp.models.TestModel
'> and <class 'mainApp.models.TestModel'>. #기억과 검색 결과를 바탕으로 재구성
관련글: https://code.djangoproject.com/ticket/22280
모델이 충돌한다고 한다.
이전에 에러를 잡는다고 app_lable이니 Meta Class니 이것저것 건드려서 발생한 문제인가 생각했다.
해결해 보려고 여러 가지를 수정하니 이전에 봤던 에러가 뜨면서 순환한다.
어제 결국 3시간동안 붙잡고 있다가 해결하기 못하고 잠들고, 오늘 일어나서 정리 글을 쓰려고 from mainApp.models으로 돌려 봤는데 작동한다.
위의 이 이미지를 캡쳐하기 위해 작성한 건데 돌아간다. 빨간 밑줄이 그어져도 실행할 수 있다는 것을 알았다. 에디터의 구문 해석과 직접 실행할 때 파이썬 인터프리터의 해석에는 차이가 있나보다!
어제는 왜 안됐을까?
이후 계속해서 이어지는 사소한 에러들을 수정했다.
추가했던 Meta 클래스를 지우고,
데이터베이스 필드에 Decimal 필드에 Str값을 넣은 것 문제가 있었는데, 필드 입력 메소드를 수정하고 기존 데이터를 지우기 위해
python manage.py flush
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser #flush하면 user db도 날라가는 듯
순서대로 입력해 해결했다. (표현 오류로 장고 어드민 사이트에 접속하면 에러가 떠서 어드민 사이트에서 데이터를 삭제할 수 없었다)
이 방법이 안 되는 경우:
프로젝트 디렉토리에 db.sqlite3 파일 지우고 <애플리케이션 이름>/migrations안의 *.py, *.pyc 파일 지우고 시도
https://softwaree.tistory.com/79 참조
마지막으로 모델의 __str__에서 + 연산자가 Deciaml과 str을 더할 수 없어서 str(decimaltype) + str로 수정하니 모든 것이 정상적으로 작동했다.
오늘의 교훈:
에러가 끝없이 이어지고, 내가 뭘 하고 있는지 모르겠다는 순간이 오면 (그저 StackOverFlow에서 하란 대로 따라하고 있는 경우)
모든 것을 되돌리고 처음으로 돌아가서 정확히 빠짐없이 입력했는지 라인 단위로, 글자 단위로 체크해 본다.
그리고 (에러, [문제 상황 추측 ,] 수정하기 위해 한 일) 튜플을 기록한다. 기록이 없으면 끝없는 에러의 지옥에서 길을 잃게 된다.
자고 일어나니 버그가 잡히는 일은 프로그래머의 농담인 줄 알았는데, 나도 '왜 작동하는지 모르겠는데 돌아가네' 상황을 겪어보게 되었다.
나도 이제 진정한 프로그래머가 된 걸까?
헛소리고, 다음부터는 에러를 잘 기록해 원인을 찾자.
'서비스 개발 > 웹' 카테고리의 다른 글
[lolupdates.gg] PyCharm에서 Django 프로젝트 뼈대 만들기 (0) | 2020.03.10 |
---|---|
[lolupdates.gg] 롤 최신 버전 정보 받아오기 (0) | 2020.03.04 |
[lolupdates.gg] 프로젝트 시작 (0) | 2020.03.04 |
[네이버 부스트코스 웹 프로그래밍] JDBC 실습 MySQL The server time zone value 에러 (0) | 2020.02.29 |
[네이버 부스트코스 웹 프로그래밍] MySQL DCL(데이터베이스 접속, 관리, 권한부여), DDL, DML, 문자 인코딩(ASCII/Unicode/UTF-8) (0) | 2020.02.29 |