본문 바로가기

About coding/Today I learned

2023년 06월 13일 TIL [#unicodedecode 에러]

 

 


오늘의 학습 계획

_구글 로그인 기능 구현하기

_카카오 로그인 기능 구현하기


기록하고 싶은 학습내용

_

_

_


오늘 만난 어려움

문제:

구글 로그인 만드려고 오랜만에 Develop 브랜치를 땡겨다가 작업 브랜치를 만들고

내 도화지가 이상이 없는지 python manage.py runserver 확인해보았더니

이런 오류가 떴다!

DONG HYUN LEE@DESKTOP-AE57O4H MINGW64 ~/Desktop/b4_exhibitions_backend (feature/kakao)
    for k, v in parse_dotenv(f.read()).items():
UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 103: illegal multibyte sequence
(venv)

유니코드 디코드 에러?!

 

시도:

모르는 에러이지만 실마리를 찾기 위해 가설을 던져본다면

1. 뭔가 인코딩하는 과정에서 발생한 에러같은 느낌

2. cp949 라는 것이 코덱 이름이므로 저걸 검색해보면 앞서 겪은 사람들이 있을 것 같은 느낌

그래서 크롬 브라우져로 검색을 했더니

뭐 이런 이야기들이 나오고

쭉 살펴보니 한글을 인코딩 하기 위해 내가 모르는 어딘가에서

cp949라는 코덱이 사용되었는데, 그걸 그냥 얌전히 utf-8로 사용하도록 설정하면 문제가 해결될 삘.

구체적으로 어디에서 그걸 설정하며, 뭐라고 코딩쳐야될지 전혀 감이 안오므로

짜디짠 프로젝트 시간에 헛고생 할 것 없이 인공지능에 검색했다.

핵폭탄이 이미 나왔듯이 인공지능도 이미 나왔기 때문에 있는 걸 없앨 순 없다...

OPEN API 회사가 망하기 전에 내가 먼저 죽을 게 분명하고...

안 쓰는 것 보단 잘 쓰는 방법을 연구하는게 현명할 듯.

나는 코딩하는데 인공지능한테 많이 배우기로 했다.

GPT, 코파일럿 이런애들한테 많이 배우고, 다만 그들이 쓴 코드를 무지성으로 갖다 쓰는게 아니라

한 줄 한 줄 의미가 뭔지 뜯어서 배워가면 된다고 생각함.

어차피 이 학원 끝나면 물어볼 선생님도 없다.

혼자 구글링하거나 스택오버플로우 해야하는데, GPT4가 이미 너무 똑똑해서 내가 찾으려는 똑같은 서류더미에서 나보다 더 빠르게 많은 양을 잘 선별해주는걸?

플라스틱냄새 나는 코드를 줄 때도 있지만, 일단은 할 줄 아는 상태에서 나중에 사람냄새 나는 코드랑 옷깃이 스치면 저절로 배워질거라 생각한다.

난 초보니깐 일단은 양으로 치기!

 

일단 이게 무슨 에러인지부터 다시 물어봄. 맥락에 맞게 응답을 하기 때문에 fundamental 대화 기록을 쌓아 나간다는 생각으로 챗봇을 운용하면 내가 원하는 대답에 한발짝 더 정확히 다가갈 수 있음.

이게 무슨 에러야?

이 에러는 Python이 해당 파일에서 문자열을 인코딩하는 데 어려움을 겪고 있다는 것을 나타냅니다. 'cp949' 인코딩은 주로 한국어로 사용되며 일부 문자가 명확하지 않기 때문에 UnicodeDecodeError가 발생할 수 있습니다.

이 문제를 해결하려면 os.environ.setdefault 대신 os.environ.get을 사용하는 것이 좋습니다. system에서 기본값을 제공할 수 있도록 바꾸는 것이 최상의 해결책입니다.

 

오오 왠지 느낌이 좋군! 말이 잘 통하고 있다.

그래서 구체적으로 아래와 같이 하라고 했다.

 

해결:

1. 가상 환경에서 python-dotenv를 설치하세요:

pip install python-dotenv

2.  manage.py 파일에서 올바른 모듈을 가져오도록 코드를 수정하세요:

#!/usr/bin/env python
import os
import sys
from dotenv import load_dotenv

def main():
    """Run administrative tasks."""
    # ...
    # 기존 코드가 남아 있습니다. 중복되지 않도록 주의하세요.

if __name__ == '__main__':
    dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
    load_dotenv(dotenv_path, encoding='utf-8')
    main()

이제 load_dotenv 함수가 올바르게 가져와져야 하며, 이전에 발생한 ImportError는 해결됩니다. 만약 여전히 문제가 발생하면 알려주세요.

 

알게된점: 

해결은 됐는데, 난 이전에 django-dotenv를 쓰고 있었기에 그거랑 이거랑 중복되는 건지 알고 싶어졌다.

 

Q. 해결은 됐어 고마워. 근데 난 이전에 django-dotenv 라는 패키지를 쓰고 있었는데 네가 알려준 python-dotenv 랑은 중복되지 않는거야? 이제 django-dotenv 는 지워도 되는걸까?

 

A. 네, 그렇습니다. django-dotenv와 python-dotenv는 비슷한 기능을 제공하는 서로 다른 패키지이지만, 일반적으로 python-dotenv가 더 널리 사용되고 활발하게 관리되고 있습니다. 따라서 python-dotenv를 사용하는 것이 좋습니다.

django-dotenv와 python-dotenv 패키지가 중복되지 않도록, 기존의 django-dotenv를 지워도 됩니다. 가상 환경에서 다음 명령어를 사용하여 제거할 수 있습니다:

pip uninstall django-dotenv

제거 후 프로젝트에서 django_dotenv 관련 코드가 없는지 확인하고, 필요하다면 dotenv 모듈을 사용하는 방식으로 변경하세요. 이전 답변에서 제시한 python-dotenv 예제 코드를 참고해주세요.

 

이렇게 말하긴 하는데,

혹시나 django-dotenv 지웠다가 시크릿코드 숨겨놓은 파일이 깃에 올라갈까봐

일단 지우진 않아야 겠다.

python-dotenv 사용법을 검색해서 읽어보고 교체 작업을 잘 한 뒤에 커밋해야겠음.