Windows pip에서 UnicodeDecodeError 발생

Development / Python

센터에서 지원받아 사용하던 13인치 맥북을 반납하고, 내 개인 15인치 맥북은 사무실에 상주시키기로 하였기에 집에서는 다시 윈도우 노트북으로 작업을 하게 되었다. 고작 15개월간 맥으로 갈아타 개발을 했을 뿐인데 다시 돌아온 윈도우는 개발하기에 너무나도 불편하였다! (내가 유별난게 아닐것이다!) 결국 우분투를 설치해도 보았지만, Wine으로 카카오톡이나 멜론을 정상 실행할 수 없었기에 결국 다시 윈도우로는 와야하겠고.. (카톡만 잘 되었어도 그냥 버텼을텐데, 새로운 메시지가 오자마자 Crash가 터지는 이유를 도저히 알 수 없었다.) 이런 와중에 윈도우에 개발 환경을 다 세팅하고 Flask 개발을 위해 pip install Flask를 입력하는 순간 UnicodeDecodeError 예외가 나를 당황스럽게 만들었다.

물론 인터넷에 여러가지 해결책이 나와있지만, 그 해결책 각각들은 내게 도움이 되지 않았고, 간만에 아주 긴 삽질을 통해 두 가지의 아티클을 조합하여 문제를 해결하였다! (문제는 당연히도 비유니코드 문자열 이슈 때문인듯 하다. 아마도 경로에 들어있는 멀티바이트 문자 같은 것들 때문인듯.)

  1. Python이 설치된 경로(e.g. 나의 경우에는 C:\python)의 lib 디렉토리(윈도니까 폴더라고 해야하는 것인가)에 있는 site.py(c:\python\lib\site.py)를 열어 479, 490 라인의 asciiutf-8로 수정한다.

    def setencoding():
        """Set the string encoding used by the Unicode implementation.  The
        default is 'ascii', but if you're willing to experiment, you can
        change this."""
        encoding = "utf-8" # Default value set by _PyUnicode_Init() # 요기!
        if 0:
            # Enable to support locale aware default string encodings.
            import locale
            loc = locale.getdefaultlocale()
            if loc[1]:
                encoding = loc[1]
        if 0:
            # Enable to switch off string to Unicode coercion and implicit
            # Unicode to string conversion.
            encoding = "undefined"
        if encoding != "utf-8":  # 요기!
            # On Non-Unicode builds this will raise an AttributeError...
            sys.setdefaultencoding(encoding) # Needs Python Unicode build !
    
  2. 같은 디렉토리의 ntpath.py를 열어 87번째 라인의 p_pathp_path.encode('utf-8')로 치환해준다.

    ....
        elif p_drive and p_drive != result_drive:
            if p_drive.lower() != result_drive.lower():
                # Different drives => ignore the first path entirely
                result_drive = p_drive
                result_path = p_path
                continue
            # Same drive in different case
            result_drive = p_drive
        # Second path is relative to the first
        if result_path and result_path[-1] not in '\\/':
            result_path = result_path + '\\'
        result_path = result_path + p_path.encode('utf-8')  # 요기!
    ## add separator between UNC and non-absolute path
    if (result_path and result_path[0] not in '\\/' and
        result_drive and result_drive[-1:] != ':'):
        return result_drive + sep + result_path
    return result_drive + result_pat
    

이제 잘 될것이다!

Share on : Twitter, Facebook or Google+