파이썬 pyinstaller 모듈 에러

하루너츠·2023년 1월 2일
0

python 오류 모음

목록 보기
1/1

백엔드 개념에서의 프로그램이 아닌 이상 윈도우 환경에서 사용하기 익숙한 GUI 형태로 프로그램을 개발하는 것이 자주 있을 수 밖에 없는 것 같다.

회사업무를 보면서 다른 분야 사람들에게 제공할 목적으로 만드는 프로그램들은 간단하게라도 인터페이스를 입혀서 개발하는데 익숙치 않아 에러를 많이 보고 있다.

그 중 pyinstaller 로 생성한 EXE 파일의 모듈 인식 에러가 자주 발생했다.

pyinstaller 는 파이썬으로 작성된 코드를 EXE 실행 파일로 변환해주는 모듈이다. 설치도 사용도 간단한데 CMD 창에서 변환하고 싶은 코드가 있는 경로로 이동하여 명령어만 실행하면 변환해준다.

명령 프롬프트 창에서 pip로 명령어를 통해 설치가 가능하다.

pip install pyinstaller

cd [파일경로]
pyinstaller -F ./[파일명].py

[ -F 옵션은 실행 파일 하나만 생성할 때 사용 ]

실행하고 나면 실행한 경로에 dist라는 폴더가 생기는데 폴더 안에는 -F 옵션 유무에 따라 파일 또는 폴더가 생성되어 있다. 코드가 정상적이라면 실행될 것이다. 오류가 있다면 아래처럼 오류 로그를 출력해준다.

No module named 'mido'

mido 라고 하는 모듈이 설치되어 있지 않다는 import 에러인데, 파이참으로 프로젝트를 열어 실행시켜 보면 정상적으로 작동한다.

혹시 몰라 프로젝트의 인터프리터의 라이브러리 설치 현황을 확인해보니 모두 정상적이었다.

파이썬을 다시 깔아보기도 하면서 삽질한 결과 pyinstaller가 가상환경의 라이브러리를 인식하지 않는 것 같다는 결론을 얻었다.

파이썬을 설치한 직후 파이썬 폴더 내의 라이브러리가 저장된 공간을 가보면 (Lib/site=packages) 아래와 같이 기본적인 라이브러리들만 설치되어 있다.

이 상태에서 pyinstaller를 실행시키면 당연하게도 pyinstaller 실행에 필요한 모듈들이 설치된다.

2023. 01. 02

pyinstaller 이름의 폴더 말고도 다양한 폴더들이 생성됐는데 pyinstaller의 정상적인 작동을 위해 필요한 것들이라고 생각이 든다.

오류의 원인을 찾기 위한 과정이라 파일 하나만 덩그러니 있는것보다 폴더채로 존재하는것이 좋아보여 이번에는 pyinstaller -F 옵션을 사용하지 않고 진행했다. 또 프롬프트 창에 뜨는 로그들도 하나씩 읽어보며 원인을 찾아갔다.

Loading module hook ... from [path]

당연하겠지만 프롬프트 pyinstaller 폴더가 설치된 경로를 잘 찾아서 불러오고 있다.

-F 옵션을 사용하지 않았으니 dist 폴더 안에는 파일이 아닌 폴더가 생성되어 있을 것이고, 그 안의 여러 파일 중 실행파일 있을 것이다.


.exe 확장자의 응용 프로그램으로 실행이 가능하다. 폴더안의 내용을 보니 tcl , tcl8, tk가 눈에 띈다.
Tcl은 "Tool Command Language"의 약자로 일종의 프로그래밍 언어,
Tk는 크로스 플랫폼에서 사용되는 일종의 GUI 툴이라고 한다. exe파일로 변환을 시도한 프로젝트에서 그래픽 인터페이스 tkinter 모듈을 사용했기 때문에 필요한 라이브러리들을 복사해서 가져온 것 같다.

그런데 여기서 의문이 든 것은 해당 프로젝트는 tkinter 말고도 다양한 파이썬 라이브러리를 사용했고, 가상환경 폴더에는 분명 해당되는 라이브러리들이 모두 설치되어 있다는 것이다.

이번에 발생한 에러는 tqdm 이라는 모듈을 발견하지 못했다고 한다.
tqdm은 반복작업을 할 때 얼만큼 진행했는지를 확인하기 위해 사용되는 모듈이다. 직접 출력을 해가며 확인해도 괜찮지만 tqdm를 사용하면 진행바로 확인할 수 있고 사용하기도 간편하여 애용하는 편이다.

폴더에 tqdm의 모듈이 없어 발생하는 것일까 하는 의문을 해결하기 위해 직접 가상환경에 있는 tqdm 관련 폴더들을 복사해서 실행시켜보았다.

tqdm이름을 가진 두개의 폴더를 복사해 가져왔다. ( 나중에 알게 된 것인데, 이런식으로 복사해오면 굉장히 위험할 것이라고 한다. 위에서 pyinstaller 설치할 때도 그렇지만 해당 이름을 가진 모듈만 설치되는 것이 아니라 관련된 또 다른 이름의 모듈들이 설치되어 사용되어지기 때문이다. 아래 에러도 이러한 원인으로 발생한 것 같다. )

여전히 오류는 발생하지만 tqdm 모듈이 없다는 오류메시지가 아닌 다른 오류 메시지이다. 라이브러리를 가져와주니 인식은 하는 모양이다.

결국 실행파일을 만들어낼때 가상환경의 lib 공간을 참고하지 않기에 해당 라이브러리를 가져오지 못한다는 것이다. 파이썬 원본이 들어있는 lib는 조금 전에 새롭게 설치했으므로 tqdm를 비롯한 프로젝트에서 사용한 라이브러리가 설치되어 있지 않았고, pyinstaller가 파이썬 원본의 lib를 참고한다면 이런 오류가 발생하기에 충분하다고 생각된다.

( pip로 파이썬 원본에 tqdm를 설치하여 진행했을 때 생성된 폴더에는 tqdm 폴더가 있지는 않았다. 그런데 오류가 사라진 것을 보면 내부적인 무언가가 있는 모양이다 )

pip로 tqdm를 설치하고 pyinstaller로 프로젝트를 변환하여 실행시켜보니 tqdm의 오류는 사라졌고 mido 오류가 새롭게 등장했다. mido라이브러리는 MID파일 관련 작업에 사용되는 라이브러리이다.

결과적으로 이런식으로 필요한 모듈들을 원본 파이썬에 설치해주면 해결되긴 하겠지만 너무 비효율적인것 같다.

가상환경에 pyinstaller를 설치하여 사용하면 된다고 한다. ㅎㅎ;;
명령 프롬프트에서 일반적으로 실행하게 되면 당연히 파이썬 원본을 참고하게 된다는 것을 잊고 있엇다..

0개의 댓글