winterjung blog


Pyinstaller로 PyQt5코드를 exe로 만들기

원래 쓰려던 것은 pyinstallerrequests라이브러리가 포함된 코드를 빌드할 때 발생하는 에러와 그에 관한 해결 방법을 포스팅하려 했으나, 이는 뒤로 넘기고 먼저 pyinstaller를 통해 PyQt5라이브러리를 사용한 python코드를 윈도우 exe파일로 만드는 법을 적고자 한다.

참고로 아래 방법을 통해 윈도우8.1과 윈도우10에서 동작하는 exe는 만들 수 있었으나, 윈도우7에서는 오류가 났고 macOS에서도 동작하지 않았다.

> pip install pyinstaller
> pyinstaller --version
3.2.1
> pyinstaller main.py

2017년 2월 24일 기준으로 3.2.1버전pyinstaller를 설치할 수 있다.
pyinstaller main.py를 하면 main.py가 실행되는 exe파일이 dist폴더 아래에 생성된다.

pyinstaller의 옵션은 다양하지만 보통 쓰이는 옵션은 몇 개 안된다.

  • -F, --onefile: 최종 출력으로 exe파일 하나만 생성한다.
  • -w, --windowed: 콘솔 창이 출력되지 않게한다.
  • -i, --icon: exe파일의 아이콘을 지정한다.

더 자세한 설명과 옵션들은 아래의 이미지 참고. options


더불어 PyQt5를 빌드하기 위해서는 PyQt5의 bin폴더를 환경변수에 추가해줘야한다.
보통은 PyQt를 설치할 때 자동으로 추가되나 만약 추가되지 않은경우 lib not found같은 에러와 함께 PyQt의 여러 dll들을 찾지 못한다는 에러가 난다.
추가해야 하는 경로의 예시는 C:\Python35\Lib\site-packages\PyQt5\Qt\bin이다.

당연히 위의 경로는 하나의 예시일 뿐이므로 그대로 갖다 붙이지말자.


윈도우 10에서는 WARNING: lib not found: api-ms-win-core-*.dll같은 에러가 출력되는데 이를 해결하기 위해 아래의 페이지를 참고하자.

github issue페이지에서 이 답변이 제일 도움이 되었다.


The following solved the problem for me (on Win10 v1607 - PyQt5 App):

Add the directory of the required dlls to system Path.
My application uses PyQt5 which is dependent on api-ms-win dlls.

For PyQt5 add this directory: %WHERE EVER YOU INSTALLED PYTHON%\Lib\site-packages\PyQt5\Qt\bin

For api-ms-win dlls you need Visual Studio 2015 OR Windows SDK (download here):
Directory if you have Visual Studio:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x64
Directory if you have Windows SDK:
C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64

After you add the required paths, pyinstaller can find the files.


하여튼 나는 PyQt5의 bin폴더와 저 api-ms-win-core-*.dll을 한 폴더에 몰아주고 -p 옵션으로 폴더를 인식시키고 아래의 명령어를 실행하여 윈도우8.1과 윈도우10에서 동작하는 exe파일을 얻을 수 있었다.
pyinstaller --onefile --windowed --icon=heart.ico --clean -p C:\test main.py

다음 포스팅으로 쓸 내용을 그냥 써보자면
pyinstaller 3.2버전requests 2.13버전을 썼을 때 urllib3queueimport error가 나는 문제는 그냥 requests라이브러리 버전을 2.5로 낮춰 해결했다.

참고 블로그 : PYINSTALLER EXE 파일 빌드하며 짜증났던 부분 정리