본문 바로가기

Language/Python

[Pyinstaller] exe 파일 빌드하며 짜증났던 부분 정리

파이썬을 exe 파일로 빌드하기 위해서는 py2exe 라는 플러그인이 필요하다.

근데 요놈이 x86 파일은 잘 뽑아내는데 x64 파일은 뽑아내다가 에러를 토하시니...


다른 걸 알아보고 알아보다가 pyinstaller 라는 녀석을 발견하게 되었다.


뭐 사용 방법에 대해서는 검색하면 엄청 많이 나온다.

굳이 여기에 다 열거하긴 귀찮고, 설치 부터 사용법 까지 대략 잘 정리해놓으신 분의 블로그 주소를 링크해본다.


http://m.blog.naver.com/mandori21/220372958993



그런데 왜 이 글을 쓰기 시작했냐면 현재 Pyinstaller 는 개발자 용 버전까지 해서 3.3xxxx 까지 업데이트 되어 있다.

문제점을 몇 가지 기록해두기 위해서 글을 작성해본다.


개인적으로 사용하는 몇 가지에 대해서만 열거해둔다. 왜냐하면 내가 까먹으면 곤란하니깐... ㅡㅡㅋ

(기록 만큼 좋은 것도 없..)


그리고 3.3 버전 이하에서 발생하는 문제점도 같이 적어두도록 한다.



1. pyinstaller 또한 py2exe 처럼 그냥 exe로 빌드해버리면 여러 파일로 쪼개져버린다.

   파이썬으로 제작한 파일을 외부에 배포할 경우는 보통 exe 단일 파일로 묶게 되는데,

   그 때 사용되는 인자값이 -F 이다.
   sample.py 라는 파일이 sample.exe 파일 하나로 묶이게 된다.

   (압축 방식으로 묶이기 때문에 실행 시 압축을 푸는 딜레이가 미세하게 발생한다.)


 ex) pyinstaller.exe -F sample.py



2. exe 파일 실행 시 콘솔(도스창) 화면을 나타내고 싶지 않을 경우에는 아래의 인자값을 사용한다.

   총 세 가지 방법이 있는데 한 가지만 사용해주면 된다.


 ex) pyinstaller.exe -w sample.py

 ex) pyinstaller.exe --noconsole sample.py

 ex) pyinstaller.exe --windowed sample.py



3. 빌드된 실행 파일이 관리자 권한을 요구하도록 실행하기 위한 인자 값은 다음과 같다. 이것을 이용하면 굳이 파이썬      코드 내에서 권한 상승을 요청시키는 뻘짓을 하지 않아도 된다.
   stackoverflow 사이트 등에 나오는 (내 블로그에도 권한 상승에 대한 글이 있다.) 내용은 자기가 자기 자신을 권한 상승
   하여 실행을 요청하는 짓을 한다. 즉, 프로세스가 중복되어 실행되므로 괜한 메모리 낭비가 발생한다.
   

 ex) pyinstaller.exe --uac-admin sample.py


중요한 언급을 한다. 해당 옵션은 exe 단일 파일로 묶는 -F 인자랑 같이 쓰면 그 효력을 잃는다.

   아니.. 효력이 발생하지 않는다고 해야 하겠지. 이게 참 맘에 안드는 버그... 

   -F를 사용하지 않으면 파일이 여러개로 쪼개어 생성되겠지만 정작 메인 exe 파일은 관리자 권한 요청이

   기본으로 적용된다.

   만약 빌드하고 싶은 파일이 x64 가 아닌 x86 이라면 굳이 pyinstaller 말고 py2exe를 사용하기 바란다.

   왜냐하면 py2exe는 단일 파일로 빌드할 때도 UAC가 잘 적용되기 때문이다.


4. 빌드 파일에 아이콘을 적용하고 싶을 경우는 다음의 인자값을 이용한다. 솔직히 이것 때문에 겁나 애먹었다.

   메뉴얼을 제대로 다 정독하지 않은 내 탓이지만.. ㅠㅠ

   인자값 뒤에 파일명을 넣으면 된다고 했는데 죽어도 안 되더라. 메뉴얼을 더 정독해 보니 equal 기호를

   넣어줘야 카더라.

   왜 옵션 리스트에서 바로 안 나오고 한~~~참 뒤의 예제문 페이지에서 그런 설명이나오는게냐 -_-

   옵션은 두 개의 방법을 제공하고 있다.


 ex) pyinstaller.exe --icon=icons\icon.ico sample.py

 ex) pyinstaller.exe -i=icons\icon.ico sample.py


위의 인자값은 icons 폴더 안에 있는 icon.ico 파일을 사용한다는 의미이다. 위 예제문의 경우 .py 파일과 같은

   경로에 icons 폴더가 있는 것이다. 만약 완전 다른 경로라면 full path를 적용시키면 될 것이다.


ico 파일 외에도 icon이 리소스에 적용되어 있는 exe 파일을 사용해도 된다.

   저렇게 하면 빌드된 exe 파일의 리소스 영역에 아이콘의 이미지가 저장이 된다.

   자~ 그렇다면 여기서 잠깐, py 파일이 만약 GUI 프로그램의 소스라고 가정하고 그 GUI 화면에 윈도우의

   '제목 표시줄' 있다면?? 제목 표시줄에는 보통 프로그램의 아이콘 이미지와 프로그램의 이름이 표기가 되겠지!!?

   그럼 exe로 빌드 하기 전에 그 GUI 코드에서의 아이콘 참조 위치는 생성될 exe 자기 자신이 되도록 하면 될 것이다.

   (sys.argv 메소드와 os.path.basename 메소드를 잘 사용해보자.)


   실수로 py 파일 내에서 똑같이 icon.ico 파일을 참조하도록 해버려두니 정작 py 파일을 그냥 돌릴 땐 잘 됐었지만

   exe로 빌드된 파일은 아이콘 못 찾겠다 꾀꼬리를 외치게 되더라.


   pyinstaller는 exe 파일의 아이콘만 변경시켜줄 뿐이지 GUI 상의 아이콘을 신경써줄리 없으니 혼동하지 말자.

   물론 빌드한 폴더 내에 icon 폴더를 수동으로 넣어줄 수는 있겠지만, 그렇게 하는 것은 불필요한 짓일 뿐...

   어차피 빌드된 exe 자체에 아이콘 리스소가 들어가 있으니 자기 자신을 참조시키는 것이 더 나을 것이다.



내가 좀 헤맨 부분이 아마 저 정도 쯤 되는 듯 하다.

기록 끝~