Pyinstaller 사용하여 PyQt5 EXE 만들기 (feat. designer UI 사용)

2025. 3. 23. 17:19업무 스킬/PyQt5

728x90

구글링을 통해서 이것저것 해보고, 찾아낸 방법이다.

일단 exe파일이 정상 생성되는 것은 확인했다.

부족한 부분이나 잘못된 부분이 있으면 댓글로 공유하도록 하자.

 

1. UI path를 절대경로로 만들어주기.

나는 designer을 사용하여 UI를 만들었다.

보통 PyQt5에서 코드상태로 UI를 불러올 때는 아래와 같이 상대경로만 불러와서 사용이 가능하지만

from PyQt5 import uic

ui_path = 'my_ui.ui'
uic.loadUi(ui_path, self)

 

Pyinstaller를 사용하여 EXE파일을 만들때는, 왜인지 모르겠지만 Pyinstaller가 상대경로를 잘 인식하지 못해 Error가 발생하게 된다.

 

그래서 꼭 아래와 같이, 절대경로?를 인식해주는 함수를 써야 한다. 이해가 잘 안 되는 함수이지만 그냥 복붙 해서 쓰면 된다.

import os

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)

 

아래와 같이 path에 함수를 맥여서, 절대경로로 만들어주면 우선 Pyinstaller 시작 시 에러는 나지 않는다.

ui_path = resource_path('my_ui.ui')
uic.loadUi(ui_path, self)

 

 

2. Pyinstaller 우선 실행하기 (Spec 파일 만들기)

PyQt5, designer UI를 사용하여 일반적으로 EXE 파일을 만들면, 절대 한 번에 성공하지 못한다.

Pyinstaller가 멍청한 건지.. 경로를 잘 인식을 못한다.

 

터미널에 아래와 같이 쓰면 우선 build, dist 폴더와 spec 파일이 생성이 되는 것을 볼 수 있다.

그래서 우선 Pyinstaller를 돌려서 Spec 파일을 생성하여, 좀 다듬어줘야 한다.

pyinstaller --noconsole --onefile --icon=icon.ico project.py

 

--noconsole : 실행 시 console 창을 띄울 것인지 여부이며 나는 띄우지 않기 때문에 이렇게 썼다.

--onefile : exe 파일만 생성할지, 나열? 할지. 나는 하나만 생성한다.

--icon = icon path : exe 파일을 원하는 icon으로 설정 무조건 .ico 형태의 파일이어야만 한다.

 

여기서 가장 중요한 게

해당 코드를 써줘야 spec 파일이 --onefile에 맞게 생성이 된다.

 

우선 pyinstaller을 통해 실행하면 build, dist 폴더 및 spec 파일이 생성되었을 거다. exe파일은 dist에 폴더에 생성된다.

하지만 exe파일을 실행하면 아래와 같은 오류가 뜬다.

 

 

절대경로를 맥였음에도 ui의 경로를 찾지 못했다는 내용이다.

참 개떡 같은 경우다.

 

이제 spec파일을 만져야 한다.

 

 

3. Spec 파일 만지기.

생성된 spec 파일을 열어보면, (visual studio 코드에서 열어라)

외계어 같은 영어가 쓰여있을 거다. 우리가 건드려야 할 것은 적다.

 

우선 경로를 "또" 추가해줘야 한다.

 

경로를 추가하기에 앞서, spec 파일의 a 부분에 우리가 사용해야 할 부분은 위의 노란색 음영  3가지이다.

datas  : 우리가 exe 만들 때 필요한 파일들의 경로 입력

hiddenimports : 가끔 정상적으로 python pkg가 hook 걸리지 않아 오류 날 때 수동으로 pkg 명을 넣어 주면 됨.

excludes :  가끔 exe에 너무 많은 python pkg가 들어가서 용량이 클 때, 제외시킬 pkg 명을 넣어주면 됨.

 

우리는 일단 datas에 UI 경로를 "또" 추가해 주면 된다. 여기서 추가할 때 양식이 있다.

Tuple 형태로 추가해줘야 하는데 [ ( 'src' ), ( 'dist' ) ] 형식으로 해줘야 한다.

내가 이해하기론

src :  현재 내가 포함시켜야 할 파일의 경로.

dist : 는 exe를 만들 때 내 파일이 추가될 폴더의 경로.

 

라고 이해 했는데 틀렸으면 말해주라. 무튼 나는 onefile로 만들기 원하기 때문에 dist는 '.'으로 처리하면 된다.

 

 

datas = [ 'my_ui.ui' , '.' ] 라고 쓸 수도 있지만 간지가 나지 않는다.

add_data 라는 개체를 만들어서 필요한 파일들을 추가한 후에 

datas = add_data라고 하면 더 간지가 난다. (사실 홈페이지 예시다.)

 

그다음 spec 파일에서 중요한 exe이다.

우리가 pyinstaller 실행할 때 --onefile이라는 조건문을 써줬는데.

--onefile을 써줘야 아래와 같이 spec 파일에 exe = EXE()가 생성된다.

 

나머지 부분은 Spec파일에서 충분히 수정이 가능하다.

우리가 써야 할 것은 위의 노란색 음영 부분이다.

 

--name : 생성될 exe 파일명

--console : exe파일 실행 시 console 실행여부

--icon : exe 파일 icon

 

해당내용들은 나에 맞게 변경해 주면 된다.

 

여기까지 해주었다면

 

3. Spec사용하여 exe파일 만들기

그다음을 pyinstaller실행 시 아래와 같이 spec 파일 명만 쳐주면 된다.

pyinstaller project.spec

 

그럼 정상 작동하는 것을 볼 수 있다.

 

글쓰기 힘드네. 도움이 되었으면 감사하다고 댓글 하나씩 박고 가라.

그럼 열심히 코딩해라 화이팅.

 

728x90