Pyinstaller로 패키지화 했는데 실행시 오류가 난다면? (ModuleNotFoundError: No module named 'pkg_resources.py2_warn')
기타 삽질 2020. 6. 22. 22:17Python은 정말 프로그램 빠르게 만드는데는 최고라고 생각합니다.
물론 C로 만들면 실행속도도 빨라지고 최적화도 잘 되겠지만 신경쓸것도 많은데다가 개발속도가 그만큼 늦어집니다.
그래서 프로토타입은 Python으로 짜고 속도가 중요한 부분만 C로 짜는 경우도 많지요. (예 : Numpy)
그렇지만 Python은 Python인터프리터가 기본적으로 있어야 한다는 문제가 있습니다. 모든 PC에 Python이 깔려있다는 보장이 없기에 인터프리터를 따로 설치하거나 Virtualenv형태로 내장하거나 하는 방식으로 이용했습니다.
그런데 이러면 라이브러리들이 문제를 일으킵니다. 리눅스, macOS, Windows 각각 따로 라이브러리를 제공하는 경우(즉, C로 짜여져서 라이브러리 설치때 컴파일이 필요한 경우) 이 라이브러리들도 함께 배포해야합니다.
이러나 저러나 참 귀찮습니다.
그냥 한번에 딱 패키지화 해서 바로 쓸 수 있으면 좋을텐데요... 할때 나타난 녀석이 바로 Pyinstaller입니다.
https://pyinstaller.readthedocs.io/en/stable/
예전에는 Py2exe라는 녀석이 있었지만 이건 오로지 Windows전용으로만 만들 수 있는 물건이었고 당연히 저는 좋아하지 않았습니다. Pyinstaller는 일단 Python인터프리터가 깔리는 모든 OS를 지원하기 때문에 훨씬 더 각광을 받았고 지금은 많은 곳에서 쓰이고 있습니다.
설치도 pip의 존재로 인해 쉽습니다.
pip install pyinstaller
보통 Python환경을 만들어서 쓰시는 분들은 pip정도는 쓰고 있을테니 명령어 한번에 바로 사용이 가능하다는 점에서 점수를 주고 싶습니다.
사용방법도 쉽습니다.
그냥 패키지화 할 py파일이 있는 곳에서
pyinstaller 어쩌고.py
이러면 dist폴더가 만들어지고 이 안에 필요한 라이브러리와 실행 파일이 만들어집니다. 다만 해당 명령이 실행된 OS에 따라 windows용이 만들어지고 Linux용이 만들어지고 그렇습니다. 즉, 리눅스용 패키지를 만들려면 리눅스에서 명령을 내려야 하고 Windows용을 만들려면 Windows에서 명령을 내려야 한다는 것이지요. 어쨌건 쉽습니다.
그런데...
오늘 Pyinstaller로 패키지화 하고나서 프로그램 실행이 안 되는 현상을 발견했습니다.
이상하더군요. 그냥 소스형태에서는 실행이 되는데 패키지화만 하면 실행이 안 되는 겁니다. 터미널에 떠있던 문구는 다음과 같았습니다.
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
py2_warn이란 패키지가 없다는 의미였습니다. 저는 이미 Python3를 쓰고 있었고 오로지 Python3만으로 작업 했는데 python2경고에 관한 내용이 있다는 것이 이상했습니다.
이 문제를 찾아보니 Pyinstaller 실행시 만들어지는 spec파일을 수정해서 다시 패키지화하면 된다고 하는데 다시 하려니 너무 귀찮았습니다.
더 찾아보니 Python3.7이 나온뒤에 함께 배포되는 최신 setup_tools와 Pyinstaller가 맞지 않아 생긴 문제라고 합니다.
https://stackoverflow.com/questions/61574984/no-module-named-pkg-resources-py2-warn-pyinstaller
2020년 현재 setup_tools는 46버전입니다. 현재 이 버전은 github관련 코드를 가지고 있고 py2_warn 내용을 가지고 있습니다. 그냥 Python2는 지원기간이 끝났으니 사용을 권장하지 않는다는 내용인데 이게 도리어 문제를 일으키고 있는 것입니다.
그럼 방법은 아주 간단합니다. py2_warn이 없는 45버전 이하로 setup_tools를 깔고 Pyinstaller를 쓰는 겁니다. 어차피 다시 패키징할일은 거의 없을 것 같기에 잠시 버전을 내렸다가 다시 올리면 될 일이었습니다. 어차피 시간이 지나면 Pyinstaller에서도 해결해주겠지요.
터미널을 열고 (윈도우라면 cmd혹은 Powershell)
pip install --upgrade 'setuptools<45.0.0'
만약 리눅스라면 앞에 sudo를 붙여주세요.
이러면 44버전대의 마지막 버전을 설치해줄겁니다. 그리고 Pyinstaller를 실행하면 문제없이 패키지화된 실행파일이 실행 될 것입니다.
이런 문제가 해결될때까지 3.6버전에 눌러앉아 있는 것도 방법입니다.
'기타 삽질' 카테고리의 다른 글
추억의 게임을 리눅스에서 돌려보았다 (1) | 2020.09.10 |
---|---|
scrcpy(안드로이드 미러링프로그램)를 라즈베리파이에서 돌려보자 (0) | 2020.09.06 |
Chrome 강제 다크모드 사용하기 (0) | 2020.05.26 |
The Room Three (더 룸 3)Steam판 한글패치 (46) | 2020.03.18 |
Digispark 클론 부트로더 업그레이드 하기 (0) | 2019.11.02 |