IT/DevOps

[Pyinstaller] exe 파일 못 만드는 오류! (yolo ultralytics 관련)

kykyky 2023. 8. 18. 03:22

상황 설명은 필요 없고 빠른 해결을 원하신다면 빨간 글자를 따라가주세요! 

 

상황.

 

pyqt를 이용해 인터페이스의 구성과 기능을 정의했으며, 그 기능들 중에는 yolo v8 모델의 predict 메서드를 활용하는 것이 있다.

실제로 실행시킬 main.py는 별개로 작성했으며, 여기서는 위에서 만들어진 인터페이스 py 내의 클래스를 임포트한다.

나는 이 main.py를 exe로 만드려 한다.

 

우선 새로운 폴더에 프로그램 구동에 필요한 모든 파일 (인터페이스 py 파일, main.py, yolo v8 모델의 pt 파일 정도?) 들을 넣어놓고,

이 폴더 위치에서 터미널을 열어 아래와 같이 실행하였다.

 

pyinstaller -w -F main.py

 

이를 통해 생성된  작업폴더 > dist > exe 파일을 실행해보았다.

 

 


 

오류 01.

 

다음과 같은 오류 메시지가 떴다.

 

맨 마지막 줄을 보면, FileNotFoundError가 떴다.

 

에러 메시지 안의

importlib의 _bootstrap.py, 

ultralytics/utils의 여러 .py들의 

해당하는 line에 호출된 함수들을 전부 구경하였다.

 

마지막에 도착한 함수는 그냥 결국 yaml 파일을 열어보는? 함수였다.

 

그냥, 이 함수는, 위 파일을 못찾겠다고 했을 뿐이다.

 

 

해결 01.

아래와 같이 입력하여 새롭게 exe를 만든다.

 

pyinstaller --collect-data ultralytics --onefile main.py

 

내 생각엔,

저 오류 메시지에서, 못찾겠다는 그 path에서

어쩌구저쩌구.. 하다가 MEI 어쩌구가 나오고

그 바로 다음에 나오는, 나의 경우는 "ultralytics"를,

--collect-data 뒤에 입력해야 하는 것 같다.

 

이제 다시 exe를 실행해 본다.

 

출처: https://stackoverflow.com/questions/73087151/pyinstaller-filenotfounderror-errno-2-no-such-file-or-directory

 


 

오류 02.

 

 

이번에도 또 FileNotFoundError가 떴다.

(근데 이번 오류에 있는 path는 위처럼 복잡한 path가 아니고, 그냥 내가 main.py 상에서 상대경로를 통해 갖다쓴 파일 경로임.)

 

(위와 다르게 에러 메시지가 콘솔창에 뜨는 이유: 단지 이번에는 내가 "-w" 옵션을 추가하지 않아서임.)

(그리고, 이러한 오류창은 떴다가 바로 사라진다.
이를 해결하려면 커맨드창에서 실행하여 창 내에 에러 메시지가 써있도록 하라는데,

나에겐 그조차 일이라서, 그냥 빠르게 캡쳐했다.ㅋㅋ)

 

해결 02.

 

main.py가 아니라 main.spec에서,

4번 줄처럼, 아까 위에서 못찾겠다는 그 파일을 튜플 형태로 추가해준다.

 

만약 오류 상에서 없다는 파일 path 가 'aaa\\bbb.hwakjangja' 라면 다음과 같이 해줘야 한다:

 

('./aaa/bbb.hwakjangja', './aaa')

 

 

그런 다음, 다시 터미널에 아래와 같이 입력해준다.

 

pyinstaller main.spec

 

 

그리고 주황색 줄 친 collect_data_files가 아까 내가 터미널에서 명령어로 친 --collect-data 가 적용된 것이 아닌가 싶다!

 

 

이제 다시 exe를 실행해 본다.


오류 03.

 

여전히 위와 같은 오류가 똑같이 떴다.

경로 인식의 문제인 것 같다.

 

해결 03.

 

main.py의 맨 위에 아래와 같이 입력해준다.

import os
 
try:
    os.chdir(sys._MEIPASS)
    print(sys._MEIPASS)
except:
    os.chdir(os.getcwd())

 

그런 다음 다시 터미널에 아래와 같이 입력해준다.

 

pyinstaller main.spec

 

 

이제 다시 exe를 실행해 본다.

 


 

오류 04.

 

그랬더니 인터페이스 창 뜨기까지 되었다.

그런데 웹캠을 켜는 버튼을 누르면, 갑자기 똑같은 창이 하나 더 생긴다.

이때 어찌저찌 하면 제 기능을 활용을 할 수는 있으나, 여튼 올바른 상황은 아니다.

 

해결 04.

 

main.py의 윗부분에 아래와 같이 입력해준다.

from multiprocessing import freeze_support
freeze_support()

 

다시 터미널에 아래와 같이 입력해준다. 

 

pyinstaller main.spec

 

 

이제 exe 파일을 실행해본다.

 

그러면 인터페이스 창이 정상적으로 하나만 뜨며, 이외의 모든 기능도 잘 작동된다.

 

 

출처: https://stackoverflow.com/questions/73674500/pyqt-app-built-with-pyinstaller-duplicating-window