출처: https://www.youtube.com/watch?v=Es1fQqqxIFQ
사용을 위해서는 일단 pip3 install pyinstaller 로 해당 패키지를 설치해야한다.
패키지 실행은 터미널에 명령어를 입력해서 수행한다.
기본 사용법
pyinstaller ./practice.py
프로젝트 폴더의 practice.py를 exe 파일로 생성한다.
생성된 exe파일은 프로젝트 내에 생성된 dist 폴더 안에 존재한다.
exe 파일은 터미널 상에서 수행된다.
하나의 파일로 생성하기
pyinstaller -F ./practice.py
-F(대문자) 옵션을 넣으면 하나의 실행파일로 생성한다.
GUI 사용하기
pyinstaller -w ./practice.py
-w(소문자) 옵션을 넣으면 창 모드로 실행시킬 수 있다.
이때 gui에 필요한 이미지들은 해당 exe 파일을 기준으로 알맞은 경로에 넣어놔야 한다.
GUI를 사용하는 exe 파일을 하나의 파일로 생성하기
pyinstaller -F -w ./practice.py
-F, -w 옵션을 넣으면 하나의 파일로 창모드로 exe 파일을 생성할 수 있다.
이때 exe 파일은 실행할 때마다 임시 폴더를 생성하고 거기에 압축된 파일들을 풀어내고 실행이 된다. 때문에 하나의 파일로 생성한 실행 파일은 폴더로 생성할 때보다 실행이 느리다.
하나의 파일로 생성한 실행 파일은 어떠한 이미지 파일을 사용해야 하는 경우에는 경로 문제가 생길 수 있다.
파이썬 스크립트에선 상대 경로로 지정이 되었는데 이를 실행 파일로 만들고 임시 폴더에서 실행하니 경로가 어긋난다.
https://stackoverflow.com/questions/51264169/pyinstaller-add-folder-with-images-in-exe-file
해결법은 위 링크를 들어가면 나와 있다.
import os
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
위와 같은 함수를 선언하고 파일 경로를
file="gui_basic/img.png"
위와 같은 형태에서
file=resource_path("gui_basic/img.png")
이와 같이 변경하면 스크립트에 기재된 상대경로를 받아서 절대 경로로 반환하여 경로 오류를 해결해준다.
실행에 필요한 파일을 명시하여 원하는 경로에 집어넣기
pyinstaller -w --add-data './gui_basic/*.png;gui_basic' ./gui_basic/3_label.py
위 코드는 .py 파일을 실행시킬 때 필요한 png 등 파일들을 명시적으로 추가해준다.
dist 폴더에 같이 추가되고, -F 옵션을 써도 하나의 파일로 같이 묶이게 된다.
--add-data의 인수는 'src;dest'(맥에선 ; 대신 :를 사용)과 같이 작성한다.
src는 추가할 파일의 위치, dest는 해당 파일을 어느 위치에 넣을지를 기재한다.
위 코드에선 프로젝트 폴더의 gui_basic폴더 내의 모든 png 파일들을 pyinstaller로 생성될 실행 폴더에 gui_basic를 생성해 해당 폴더 아래에 넣게 된다. 실행파일과 같은 경로에 파일을 추가하고 싶다면 . 을 입력하면 된다.
만약 여러 위치의 파일을 넣고 싶다면 아래와 같이 --add-data 옵션을 추가하면 된다.
pyinstaller -w --add-data './gui_basic/img.png;gui_basic' --add-data './gui_basic/img2.png;gui_basic2'./gui_basic/3_label.py
실행에 필요한 파일을 명시하며 하나의 실행파일로 생성하기
pyinstaller -w --add-data './gui_basic/*.png;gui_basic' -F ./gui_basic/3_label.py
이전 코드에 -F 옵션을 추가하면 된다.
사용자가 아이콘 파일을 임의로 지정하기
pyinstaller -w --add-data './gui_basic/*.png;gui_basic' -F -i 'icon.ico' ./gui_basic/3_label.py
-i 옵션와 .ico 파일의 경로를 명시해주면 된다.