PyInstaller로 Python 코드를 실행 파일로 변환하기
Python은 훌륭한 프로그래밍 언어이지만, 최종 사용자에게 배포할 때 종종 문제가 발생합니다. 사용자가 Python과 필요한 모든 라이브러리를 설치해야 한다는 점은 큰 진입장벽이 될 수 있습니다. 이런 문제를 해결하기 위해 PyInstaller를 사용할 수 있습니다.. PyInstaller는 Python 스크립트를 독립 실행형 실행 파일로 변환하여, 최종 사용자가 Python을 설치하지 않고도 프로그램을 실행할 수 있게 해줍니다.
해당 라이브러리를 사용하기 위해서는 python3.8 이상의 버전을 사용해야 합니다.
PyInstaller 설치하기
시작하기 전에 PyInstaller를 설치해야 합니다. pip을 사용하여 쉽게 설치할 수 있습니다:
pip install pyinstaller
기본 사용법
가장 기본적인 사용법은 매우 간단합니다:
pyinstaller script.py
이 명령어는 script.py
파일을 분석하고, 필요한 모든 종속성을 포함하는 실행 파일을 생성합니다. 기본적으로 PyInstaller는 다음과 같은 디렉토리를 생성합니다:
build/
: 빌드 과정에서 생성되는 임시 파일이 저장됩니다.dist/
: 최종 실행 파일과 필요한 지원 파일이 저장됩니다.
또한 .spec
파일도 생성되는데, 이것은 빌드 구성을 정의하는 Python 스크립트입니다.
주요 옵션 소개
PyInstaller는 다양한 옵션을 제공하여 빌드 과정을 사용자 정의할 수 있습니다. 가장 많이 사용되는 옵션들을 살펴보겠습니다. 내가 작성한 코드가 script.py 파일이라면, 최종 실행 파일을 생성할 때 아래와 같은 옵션을 사용할 수 있습니다.
1. --onefile
또는 -F
, --ONEDIR
또는 -D
옵션
단일 실행 파일로 패키징하려면 다음 옵션을 사용합니다:
pyinstaller --onefile script.py
이 옵션은 모든 종속성과 리소스를 하나의 .exe
파일(Windows) 또는 실행 파일(macOS, Linux)로 묶어줍니다. 이는 배포가 간편하지만, 실행 파일의 크기가 커지고 시작 시간이 느려질 수 있습니다.
실행이 늦어지는 문제를 해소하기 위한 방법 중에 하나가 –onedir 또는 -D 입니다. 관련 파일을 하나의 디렉토리로 구성하는 방법입니다. 최초 1회 실행 시간이 늦어지는 반면 이후부터는 빠른 재실행이 가능해집니다.
pyinstaller --onedir script.py
2. --windowed
또는 -w
옵션
GUI 애플리케이션을 만들 때는 콘솔 창 없이 실행하고 싶을 것입니다:
pyinstaller --windowed script.py
이 옵션은 Windows에서는 콘솔 창이 나타나지 않게 하고, macOS에서는 앱 번들을 생성합니다.
3. --name
옵션
실행 파일의 이름을 지정할 수 있습니다:
pyinstaller --name=MyApp script.py
4. --icon
옵션
실행 파일에 아이콘을 추가할 수 있습니다:
pyinstaller --icon=icon.ico script.py
Windows에서는 .ico
파일, macOS에서는 .icns
파일, Linux에서는 .png
파일을 사용합니다.
5. --add-data
옵션
스크립트와 함께 추가 파일이나 디렉토리를 포함시킬 수 있습니다:
pyinstaller --add-data="images;images" script.py # Windows
pyinstaller --add-data="images:images" script.py # macOS, Linux
첫 번째 경로는 소스 파일/디렉토리이고, 두 번째 경로는 실행 파일 내의 목적지 경로입니다. Windows에서는 세미콜론(;
)으로, macOS와 Linux에서는 콜론(:
)으로 구분합니다.
6. --add-binary
옵션
바이너리 파일(예: DLL, 공유 라이브러리)을 추가할 때 사용합니다:
pyinstaller --add-binary="library.dll;." script.py # Windows
pyinstaller --add-binary="library.so:." script.py # macOS, Linux
7. --hidden-import
옵션
PyInstaller가 자동으로 감지하지 못하는 종속성을 명시적으로 추가할 수 있습니다:
pyinstaller --hidden-import=module_name script.py
8. --exclude-module
옵션
불필요한 모듈을 제외하여 실행 파일 크기를 줄일 수 있습니다:
pyinstaller --exclude-module=module_name script.py
9. --clean
옵션
빌드하기 전에 PyInstaller 캐시와 임시 파일을 제거합니다:
pyinstaller --clean script.py
10. --noupx
옵션
UPX(실행 파일 압축 도구)를 사용하지 않도록 설정합니다:
pyinstaller --noupx script.py
11. --runtime-hook
옵션
실행 시점에 실행되는 스크립트를 추가할 수 있습니다:
pyinstaller --runtime-hook=hook.py script.py
12. --key
옵션
바이트코드를 암호화하여 리버스 엔지니어링을 어렵게 만듭니다:
pyinstaller --key=mykey script.py
옵션 조합 예시
여러 옵션을 조합하여 사용할 수 있습니다:
pyinstaller --onefile --windowed --icon=app.ico --name=MyApp --add-data="resources;resources" script.py
이 명령어는 GUI 응용 프로그램을 단일 실행 파일로 만들고, 사용자 지정 아이콘을 적용하며, resources 폴더의 내용을 포함시킵니다.
.spec 파일 사용하기
.spec
파일은 빌드 과정을 더 세밀하게 제어할 수 있게 해줍니다. PyInstaller를 한 번 실행하면 .spec
파일이 생성되며, 이를 수정하여 빌드 설정을 사용자 정의할 수 있습니다.
# .spec 파일 생성
pyinstaller script.py
# .spec 파일을 수정한 후 다시 빌드
pyinstaller script.spec
문제 해결 팁
1. 누락된 모듈 오류
PyInstaller가 모든 종속성을 자동으로 감지하지 못할 수 있습니다. 이런 경우 --hidden-import
옵션을 사용하세요:
pyinstaller --hidden-import=missing_module script.py
2. 파일 경로 문제
실행 파일 내에서 파일 경로를 올바르게 참조하려면 다음과 같이 코드를 수정해야 합니다:
import sys
import os
# PyInstaller가 생성한 임시 폴더에서 실행될 때의 경로 확인
if getattr(sys, 'frozen', False):
application_path = sys._MEIPASS
else:
application_path = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(application_path, 'resources', 'file.txt')
3. 디버깅을 위한 콘솔 출력 보기
--windowed
옵션을 사용했을 때도 로그를 확인하려면, 로그 파일에 출력을 리디렉션하는 코드를 추가하세요:
import sys
sys.stdout = open('output.log', 'w')
sys.stderr = open('error.log', 'w')
결론
PyInstaller는 Python 애플리케이션을 배포하는 강력한 도구입니다. 다양한 옵션을 통해 배포 요구사항에 맞게 실행 파일을 사용자 정의할 수 있습니다. 이 글에서 소개한 옵션들을 활용하여 최종 사용자에게 최적화된 실행 파일을 제공해보세요.
Python 개발자로서 PyInstaller를 마스터하면 프로젝트 배포 프로세스가 훨씬 간소화되고, 최종 사용자 경험이 크게 향상될 것입니다.
답글 남기기