본문 바로가기
무모한 도전-주식 인공지능 만들기/지식 정리 창고

pyinstaller를 이용, exe파일로 빌드하기

by 인터넷떠돌이 2020. 2. 13.
반응형

안녕하세요?

 

시간이 걸리기는 했습니다만, 일단 일련의 시행착오를 거친 다음에 겨우겨우 하는 방법을 알아내는데 성공해서, 한번 pyinstaller를 이용한 다음에, 이걸 exe파일 하나로만 만들어 보는 방법에 대해서 정리해서 포스팅을 하게 되었습니다. 가장 먼저 해야 할일은 속 편하게 아나콘다 프롬프트로 가서, pyinstaller가 설치되어 있는 환경을 작동 시킨 다음에, 스펙파일을 생성하고자 하는 폴더로 이동한 다음 pyi-makespec --onefile 이름.spec 이라고 타이핑을 해서 exe파일 하나로 만들기 위한 전용 스펙파일을 만드는 것 입니다.

 

일단 먼저 스펙파일이 만들어 졌다면, 위 스크린샷에서 볼 수 있는 것처럼 pyqt5가 제게는 있기 때문에, 위 스크린샷과 같이 파이썬이 설치되어있으면, PyQt5의 bin폴더에 있는 Qt5Core.dll과 bin에 있는 모든 파일을 가지고 올 수 있도록 합니다. 이 경로는 설치한 설치자 마다 다르니, 그때그때 지정을 달리해야 할 필요성이 있습니다.

 

그리고 나서 추가로 해 주어야 하는 작업이 하나 있습니다. 위 스클니샷에서 붉은색으로 밑줄을 친 부분처럼 먼저 ui파일이 어디에 있는지를 튜플형태로 지정을 해 준 다음에, 이걸 이전에 one folder로 빌드할 경우에 있었던 COLLECT가 없고 대신에 exe에 있는 a.data에 플러스를 붙여서 더해 주도록 합니다. 그리고 나서, name= 이라는 항목에서는 나오게 될 exe파일의 이름을 지정하는 곳이며, icon= 항목은 추가한 것인데, 당연히 프로젝트의 폴더 안에 있는 ico파일을 가지고 오라는 의미가 됩니다.

 

 

그리고 나서 다음으로 위 스크린샷에서 볼 수 있는 것처럼, 일단 기존의 py파일에 가서, ui파일 하나도 위 스크린샷처럼 조치를 취해야 합니다. 저 _MEIPASS가 무엇이냐고 하면, exe파일 하나로만 빌드할 경우, 컴퓨터-특히 윈도우즈 운영체제에서는 임시로 메모리상에서 폴더를 생성하게 되는데, 일단 폴더의 이름이 _MEIPASSxxxx라고 이 xxxx가 랜덤한 번호가 붙게 됩니다. 그래서 일반적으로 찾지를 못하고 이렇게 hasattr()함수를 동원해야 합니다. 이 경우에는 ui파일 하나만 해도 이런데, 문제는 다른 파일을 찾아야 한다면? 예를 들어서 사운드 파일 같은 것도 저렇게 경로를 _MEIPASS를 지정해야만 찾을 수 있다는 것이 exe파일로 만들었을 때 최대의 문제가 됩니다. 다행이라면 다행인 것은 결과를 출력하는 경우에는 저렇게 _MEIPASS를 신경쓰지 않아도 제대로 나옵니다.

 

일단 이렇게 해서 2개의 exe파일을 만들어 보았습니다. 일단 첫번째 Tester는 윈도우를 띄워서 한번 제대로 실행이 되는지 아닌지를 알아보기 위해서 했는 것이고, 다음으로 Teser2의 경우에는 전혀 윈도우를 띄우지 않고 작업하기 위해서 입니다. 여기서 명심해야 할 것은 아나콘다 프롬프트에서 프로젝트가 있는 폴더로 들어가서, pyinstaller 이름.spec 이라고 해서 스펙파일의 이름 끝에 .spec을 붙여야 합니다.

 

이렇게 해서 원래 개발환경이 되어 있는 컴퓨터에서는 제대로 나오는 것을 확인할 수 있었습니다. 이제 문제는 이게 파이썬 개발환경이 전혀 되어 있지 않은 환경에 가서는 어떻게 작동을 제대로 하느냐 여부입니다.

 

일단 기존의 onefolder에서 나왔는 결과와 차이가 없이 UI가 깨져서 나오는 것을 확인할 수 있었습니다. 그래서 하는 수 없이 이건 다음에 해결을 하도록 하고, 지금은 제대로 작동을 하느냐 하면, 그건 확인할 수 있었습니다. 제대로 작동을 합니다. 다만, 이렇게 UI가 깨져서 나오는 문제에 대해서는 일단 어떻게 해결을 하기는 해야 겠다는 생각이 듭니다.

반응형