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

pyinstaller로 1개 폴더로 빌드하기

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

안녕하세요?

 

일단 이번 포스팅에서 다루고자 하는 것에 대해서 먼저 간략하게 설명을 드려야 겠습니다. 우선 파이썬을 텍스트 파일에 쓰기만 해서는 실행이되지 않고, 이걸 파이참과 같은 개발툴을 사용해야 합니다. 그런데 여기서도 한가지 문제가 있습니다. 만약 개발툴이랑 파이썬이 설치되어 있지 않은 컴퓨터에서도 프로그램을 실행시킬 것을 염두해 두고 '빌드'를 해야 할 필요성이 있습니다. 한마디로 배포판을 만든다고 보시면 되는데, 이번 포스팅에서 다룰 것은 exe파일로 한개 나오는 것이 아니라 1개의 폴더로 나오는 것을 다루고자 합니다.

 

먼저 해야 할일은 당연하다면 당연하게도 빌드를 하고자 하는 메인 프로그램에서 사용하는 파이썬 가상환경에다가 pip를 이용, pyinstaller를 설치하는 일이 먼저 선행되어야 합니다.

 

그리고 나서 프로젝트가 있는 폴더로 가서, 위 스크린샷과 같이 pyi-makespec 메인이되는 py파일.py 라고 붙여서 스펙파일을 만들어 주도록 합니다. 사실 스펙파일 (spec file)은 없어도 상관이 없습니다. 다만 지정해야 하는 옵션이 아나콘다 프롬프트 상에서 너무 많아지기 때문에, 이걸 일일히 입력하지 않고, 미리미리 스펙파일에 지정을 해 주는 것이라고 보면 편합니다.

 

이렇게 하면, 위 스크린샷과 같이 메인이 되는 파이썬 스크립트와 이름이 같은 spec파일이 생성이 된 것을 볼 수 있습니다. 이제 이걸 연결프로그램을 이용해서 워드패드로 열면 됩니다. 제 경우에는 워드패드로 열었는데, 다른 경우는 잘 모르겠습니다.

 

 

일단 스펙파일에 대해서는 나중에 알아보도록 하고, 지금 스펙파일 보다 시행착오를 거치면서 더 중요한 것을 발견했습니다. 일단 위 스크린샷처럼 아나콘다 프롬프트에서 pyinstaller --windowed 스펙파일명.spec 이라고 입력을 해서 빌드를 하게 되면, 한가지 잇점이 나오게 됩니다.

 

제 아무리 파이참과 같은 개발툴에서 잘 만들었다고 해도, 실행을 하면서 언제나 에러는 발생할 수 있습니다. 그래서 cmd라고 명령프롬프트 창에서 일일히 찾아가서 실행파일을 실행시키면, 무슨무슨 에러가 나왔는지 알아볼 수 있습니다. 이 정보를 바탕으로 개발에는 없는데, 배포판을 만들면서 발생한 에러를 하나하나 잡아낼 수 있습니다.

 

실제로 제 경우엔느 위 스크린샷처럼 numpy의 하위 메서드일 터인데, 이게 제대로  import가 되지 않았다는 이유로 빌드했는 폴더안에 있는 실행파일이 실행이 되지 않았습니다.

 

결국 이런 문제들을 해결하고 나서야 겨우겨우 1개의 폴더안에 여러개의 패키지와 파일들이 얽혀있고, 거기서 유일하게 있는 실행파일을 실행해서 제대로 끝이 나는 것을 볼 수 있었습니다.

 

일단 테스트 결과 PyQt5가 있음에도 불구하고 제대로 된 결과를 차이없이 얻는데는 성공했습니다. 이제 빌드를 위해서 사용된 스펙파일을 한번 볼 차례입니다.

 

먼저 언급하고 넘어가야 할 것이 있는데, 일단 DataBaseReader.py만 넣어도 되느냐 하면, 실제로 메인이 되는 py파일만 넣어도 작동은 완전히 된다고 합니다. 그리고 제가 PyQt5를 사용하기 때문에 취해줘야 할 조치가 하나 있는데, 먼저 위 스크린샷을 보시면 pathex라는 항목이 있는데, 여기다가 프로젝트가 사용하는 파이썬 가상환경의 폴더에 있는 site-packages\PyQt5\Qt\bin\Qt5Core.dll; /PyQt5/Qt/bin 이라는 경로를 추가시켜 주어야 할 필요성이 있습니다.

 

그리고 나서 다음으로 해야 할일이 있는데, 제일 상단에 있는 ui_file = [('ui파일 이름과 확장자' r'ui파일까지 포함한 정확한 파일의 경로' , '.')] 이라는 것을 지정해야 하는데, 마지막에 있는 '.' 는 필드가 되었을 때, 가장 최상위의 폴더에 위치를 하라는 의미가 됩니다.

 

그리고 나서 다음으로 coll이라는 클래스로 가서 a.datas라는 항목에 + ui_file이라는 것을 붙여 주도록 합니다. 이렇게 하는 것으로 PyQt5가 포함된 경우에 pytinstaller로 빌드를 하며, 결과물이 한 개의 폴더에 모두 들어가 있는 경우를 일단 포스팅 하였습니다. 일단 부족한 부분이 이 포스팅을 하고 나니까 보이는데, 하나하나 올려 보도록 하겠습니다.

반응형