사이트링크1 https://robot7887.blog.me/221097346796 
사이트링크2  

Python은 외국에서 만든 기계언어(Machine language) 때문에 한글을 사용할 때는 다소 어려움이 많다.
그렇기 때문에, Python에서 한글을 사용하기 위해서는 Unicode(유니코드)와 조합을 해서 사용해야 된다.
이러한 문제는 Python 2.4부터 지원이되면서 3.X부터는 거의 없어졌지만, Python 2.7을 사용하는 사람은 아래와 같이 시도해본다.

Python script에 한글 사용하기
print '한글'
python 스크립트 파일에 위의 내용을 실행하는 경우 아래와 같은 에러가 발생한다.
SyntaxError: Non-ASCII character '\xc7' in file euckr-error.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

파이썬의 기본 인코딩은 Ascii이며, 스크립트 파일이 Ascii 인코딩일거라고 가정하고 읽어서 파싱할라고 하는데 Ascii로 해석이 불가능한 한글이라는 단어가 존재하기 때문에 SyntaxError(문법에러)가 발생한 것이다. 이를 해결하기 위해서는 아래와 같이 스크립트 파일 첫 줄에 파일의 인코딩을 명시해주면 된다.

#-*- coding: utf-8 -*-
print '한글'

#-*- coding: euc-kr -*-
print '한글'

str - unicode 변환
s = 'english'
print str(unicode(s))

위와 같이 영어 문자열을 Unicode로 변경 후 str로 바꾸는 코드를 실행하면 문제 없지만, 한글을 넣고 실행하는 경우 아래와 같은 에러가 발생.

#-*- coding: utf-8 -*-
s = '한글'
print str(unicode(s))

print str(unicode(s)) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc7 in position 0: ordinal not in range(128)

에러를 확인해보면, UnicodeDecodeError(유니코드 해석 에러)가 발생한다.
즉, 위에서 발생했던 python script에 한글 사용하기와는 다른 에러이며, 에러를 해석하면 ‘한글’ 을 Ascii라고 간주하고 유니코드로 변환하려고 시도했으나 해석이 안돼서 발생한 에러이다. 따라서, 이를 해결하기 위해서는 아래의 소스와 같이 명시적으로 문자열을 utf-8로 간주하고 unicode로 변환하도록 할수있다.

#-*- coding: utf-8 -*-
s = '한글'
print s.decode('utf-8').encode('utf-8')

하지만 위의 소스는 만능이 아니다. 외부 라이브러리를 만든 사람이 문자열을 유니코드로, 유니코드를 문자열로 변환할 때 인코딩을 명시적으로 적지 않앗다고 가정하자. 양놈이 그런코딩을 했으면 자신의 환경에서는 문제없이 잘 작동한다. (아래코드가 예시)

foo = unicode(s)
...
bar = str(foo)

하지만, 외국에서 개발된 라이브러리를 우리가 가져다 사용하는데 함수의 인자로 한글을 사용하게 된다면 어떨까?
위에서 이야기한 것과 같이 UnicodeDecodeError가 발생하는 문제가 생기며, 이를 해결하겠다고 라이브러리에서 유니코드 관련 인코딩/디코딩하는 모든 지점에 전부 인코딩을 명시적으로 넣어주는 것은 비효율적인 방법이다.

따라서, 만약 Unicode로 인코딩/디코딩할 때 사용할 기본 인코딩을 Ascii 대신 utf-8로 바꿔주면 쉽게 해결할 수 있지 않을까? sys.setdefaultencoding가 바로 이럴 때 사용하는 함수이다.

#-*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

s = '한글'
print str(unicode(s))

위와 같이 기본 인코딩을 Ascii대신 utf-8로 바꿔주는 내용을 스크립트 파일을 최초 진입부에 집어넣으면 된다. #-*- coding: utf-8 -*-과 달리 저것은 함수라서 호출된 이후, 계속 유지된다. 적절한 곳에 한번만 넣어주면 된다. 참고로 reload(sys)를 하지 않으면 sys.setdefaultencoding함수 를 사용할 수 없다.

References
Why we need sys.setdefaultencoding(“utf-8”) in a py script?
파이썬 유니코드 하우투
파이썬 한글 인코딩에 대해
Flask Project 구조 예제