파이썬으로 만든 프로그램을 다른 사람에게 전달해서 실행을 하려면, 그 사람의 PC에도 파이썬이 설치되어 있어야 하는 번거러움이 있다. 이 때문에, 파이썬 프로그램을 일반 실행파일(.exe)로 변환해서 건네주면 사용하는데 큰 문제가 없을 것이다. 파이썬 패키지에는 이런 변환 프로그램이 있는데, 바로 PyInstaller 이다.
pip install pyinstaller 를 입력하면 설치가 되서 바로 사용할 수 있다.
첫 번째 프로그램을 만들어보자. 필자는 C:\work\proj1 폴더를 만들 것이며, 이 안에 .venv 로 가상환경도 만든다. 가상환경은 python -m venv .venv 로 만들 수 있다. 그리고, .venv\Scripts\activate 로 가상환경을 활성화 한 후에, pip install pyinstaller 로 PyInstaller 도 함께 설치해준다.
이제, 폴더 안에 proj1.py 를 열고, 다음과 같이 입력해준다.
print("PyInstaller 로 exe 파일 만들기")
이제, pyinstaller proj1.py 를 입력하면, 실행파일(.exe)이 만들어진다. build 와 dist 폴더가 생성되는데, 이 중에서 dist 폴더 아래에 proj1 폴더가 생성되고, 그 안에 proj1.exe 가 있는 것을 확인할 수 있다.
콘솔창에서 해당 폴더로 이동해서 proj1.exe 를 실행해보자. 실행이 잘 되는 것도 확인할 수 있다.
그런데, proj1.exe 파일 외에도 _internal 폴더가 존재하는데, 그 안에 수많은 파일들이 있으며, 이 파일들도 실행하는데 꼭 필요하다. 이 많은 파일들을 배포하려니 뭔가 번거롭다.
그래서, 단 하나의 파일로도 변환할 수 있는데, pyinstaller 실행시에 -F 옵션을 주면 된다. build 와 dist 폴더를 삭제한 후에, pyinstaller -F proj1.py 를 실행해보자.
이번에는 dist 폴더 아래에 proj1.exe 파일만 생성된 것을 알 수 있다. 이번에도 실행을 해 보면, 출력이 잘 될 것이다.
콘솔 프로그램을 해봤으니, GUI 프로그램도 실행파일로 변경해보자. 아래의 proj2.zip 파일을 다운로드 하여, C:\work\proj2 에 풀어놓겠다.
여기에서도 가상환경을 만들고, 활성화시킨다. python -m venv .venv 로 가상환경을 만들고, .venv\Scripts\activate 로 활성화시킨다. 그리고, PyInstaller 로 설치한다. pip install pyinstaller 를 실행한다.
tkinter 패키지를 이용해서 만든 간단한 GUI 프로그램이다. 이미지가 입혀져 있는 버튼이 나오며, 이 버튼 클릭하면 알림 메시지가 나오게 된다. 해당 폴더로 들어가서, python proj2.py 를 실행하면, 아래와 같이 나올 것이다.
proj2.py 파일의 내용을 한 번 살펴보자. 버튼을 하나 생성하였는데, 버튼에 이미지(images/nolja-coding.png)가 적용되어 있고, 버튼을 클릭하면, "버튼을 클릭했습니다." 라는 알림 메시지를 출력하도록 되어 있는 것이다.
import tkinter as tk
import tkinter.messagebox as msgbox
import sys
import os
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
def click_button():
msgbox.showinfo("알림", "버튼을 클릭했습니다.")
root = tk.Tk()
img = tk.PhotoImage(file=resource_path("images/nolja-coding.png"))
button = tk.Button(root, image=img, command=click_button)
button.pack()
root.mainloop()
이제, 실행파일(.exe)로 변환해보자. pyinstaller -w proj2.py 입력한다. 여기에 새로운 옵션 -w 이 추가되었는데, 이 옵션이 없으면, 실행할 때, 콘솔창이 나왔다가 없어지는 현상이 생긴다. 그래서, GUI 프로그램에서는 -w 옵션을 꼭 넣어주어야 한다.
이번에도 역시 실행파일이 잘 생성되었다. proj2.exe 를 실행해보자.
메시지 내용을 보면, "images/nolja-coding.png" 파일을 찾을 수 없어서 문제가 있다라는 의미이다. 이 것을 해결하기 위한 방법이 2가지가 있는데, 첫번째 방법은 해당 폴더와 파일을 dist\proj2\_internal 폴더에 복사해주는 것이다.
위의 화면은 "images/nolja-coding.png" 파일을 복사한 이후의 상태이다. 이 상태에서 다시 proj2.exe 를 실행하면 잘 될 것이다. 그런데, 지금은 한개의 파일로 만들지 않았기 때문에, 수동으로 복사라도 할 수 있었지만, 만약 한개의 파일로 만들게 되면 방법이 없다. 그래서... 두번째 방법을 사용해야 한다.
두번째 방법은 pyinstaller 실행시에 옵션을 추가해주는 것이다. build 와 dist 폴더를 삭제한 후에, 다음처럼 PyInstaller 를 실행한다. pyinstaller -w --add-data="images/*;images" proj2.py
pyinstaller 를 실행하면서 images 폴더의 내용을 복사해주는 옵션을 추가한 것이다. 이렇게 해서 실행해보면 잘 될 것이고, 한개의 파일로 만들어서도 해보자. pyinstaller -w -F --add-data="images/*;images" proj2.py
이렇게 해서 실행파일을 만들어서도 역시 문제없이 잘 될 것이다.
'프로그래밍 > Python' 카테고리의 다른 글
FastAPI (2) : 컨트롤러 확장하기 (0) | 2024.10.15 |
---|---|
FastAPI (1) : 시작해보기 (0) | 2024.10.11 |
venv : 파이썬 가상환경 관리하기 (0) | 2024.09.19 |
Python 3.13의 REPL이 아주 좋아졌어요. 굿굿~! (0) | 2024.09.13 |
pyenv : 여러 버전의 파이썬을 설치하고 관리하기 (0) | 2024.09.09 |