Pyinstaller를 사용하며 났었던 오류와 해결 방법에 대한 정리를 해 보겠다. 우선 오류가 났을 때는 아래 매뉴얼에 나와 있는 상황인지 찾아보는 게 좋다.
Pyinstaller 매뉴얼: https://pyinstaller.org/en/stable/
ㅤ
ㅤ
위 오류 목록은 이전 게시글에서 공유한 것들이다.
ㅤ
ultralytics의 경우 default.yaml, EasyOCR의 경우 character*.txt, 그리고 tamil-ocr에서 사용하는 하위 라이브러리의 경우 version.info 파일이 각각 빠져 오류를 발생시켰다.
해결 방법은 --add-data를 통해 현재 build 작업을 진행 중인 곳에 직접 추가를 해 주는 것이다. 아래와 같이, 가상 환경이나 로컬 환경의 라이브러리 하위의 패키지들이 모여 있는 곳에서 손실된 파일이 있는 경로를 적고, :나 ;를 적고, 상대 경로 형식으로 도착 폴더 경로를 적으면 된다. 이때, 도착 폴더는 그냥 손실 파일이 있던 곳의 경로 형식을 일부 베껴 적으면 된다.
참고 문서: https://github.com/ultralytics/ultralytics/issues/8772
ㅤ
--add-data "D:\venvs\pyinstaller_venv\Lib\site-packages\ultralytics\cfg\default.yaml;.\ultralytics\cfg"
--add-data "D:\venvs\pyinstaller_venv\Lib\site-packages\easyocr\character\*.txt;.\easyocr\character"
--add-data "D:\venvs\pyinstaller_venv\Lib\site-packages\pytorch_lightning\version.info;.\pytorch_lightning"
--add-data "D:\venvs\pyinstaller_venv\Lib\site-packages\lightning_fabric\version.info;.\lightning_fabric"
ㅤ
PS. 이전 게시글에서 --collect-all easyocr을 했는데도 --add-data 하기 전까지는 오류가 났던 걸로 보아 이런 식으로 단일 파일이 빠지면 직접 경로를 입력하는 수밖에 없는 것으로 보인다.
ㅤ
tamil-ocr에서 사용한 timm, timm.models.helpers가 빠져서 No Module Import 오류가 발생했다.
해결 방법은 --hidden-import를 통해 현재 build 작업을 진행 중인 곳에 라이브러리나 모듈을 직접 import 해 주는 것이다.
ㅤ
--hidden-import=timm
--hidden-import=timm.models.helpers
ㅤ
PS. 이전 게시글에서 --hidden-import=timm을 먼저 했는데 이후에 timm.models.helpers가 없다는 오류가 뜬 것으로 보아, 특정 모듈은 Pyinstaller가 인식을 못하는 문제가 간혹 발생하는 것 같다.
ㅤ
ㅤ
.exe 파일 실행 중에 발생한 오류이다.
.exe 파일이 실행되어 기뻤던 것도 잠시... 파일을 실행시키는데 자꾸 새 창이 열려 기존 프로세스가 중단되는 현상이 발생했다. 오류는 주로 새 객체인식 모델을 로드할 때 발생했다. 처음에는 Thread 기능을 사용하기 때문인가 싶어서, Thread 기능을 사용하지 않는 방향으로 코드를 수정하고 다시 build를 진행했는데도 오류는 여전히 발생했다.
해결 방법은 multiprocessing 라이브러리를 import하고, 프로그램 실행 시작 시 freeze_support()를 불러 이런 현상을 막는 것이다. freeze_support()는 웬만하면 그냥 파일이 실행되는 첫 부분에 선언해 두는 게 좋아서 아래와 같은 코드를 사용해 시작하자마자 freeze 시켰다.
if __name__ == "__main__":
from multiprocessing import freeze_support
freeze_support()
Pyinstaller 사용이 군데군데 까다롭고 묶는 데에도 시간이 오래 걸리고 하지만 .exe 파일 묶기에 성공하고, 실행에 문제 없는 것을 확인하니 아주 뿌듯하다.