파이썬 코드를 하나의 실행파일로 만들어 사용하려면 pyinstaller 모듈을 설치해야 한다.
$ pip install pyinstaller
pyinstaller는 다양한 옵션을 제공하고 있으며, 자주 사용하는 옵션은 아래와 같다.
- --onefile (-F)
- 단일 실행 파일로 생성
- --noconsole
- 윈도우 & 맥OS에서 콘솔창 출력 없이 실행
- --distpath <DIR>
- 최종 생성 파일 경로 지정
- --workdpath <DIR>
- 임시 작업 파일 경로 지정
- --path <DIR>
- 파이썬 코드에서 참조하는 모듈 경로 지정
- add-data
- 실행에 필요한 non-binary 파일 지정
- 단일 실행 파일로 생성할 경우 실행 파일에 포함시킴
- 윈도우는 key, value를 세미콜론(;)로 구분하며, 유닉스 계열의 시스템은 콜론(:)으로 구분
ex) --add-data "j1939.png;."
- add-binary
- add-data와 동일한 기능이며, binary 파일을 지정
- --icon <ico file>
- 윈도우 실행 파일의 아이콘 지정
위 옵션을 바탕으로 pyinstaller를 사용하여 단일 실행 파일 생성하기 아래와 같은 명령어 구성을 만들 수 있다.
$ pyinstaller --name J1939 -F j1939.py --distpath output/dist --workpath output/build --noconsole --add-binary "j1939.png;."
위 명령어를 실행하였을 때, 아래 이미지와 같은 '시스템 파일에 접근할 수 없습니다' 에러가 발생할 수 있다.
위 문제는 pip로 설치한 모듈과 파이썬 버전이 맞지 않아 발생한 문제이기 때문에 파이썬과 모듈을 버전에 맞게 다시 설치해야 한다.
참고로, 위 명령어에서 png 파일을 포함하여 아이콘으로 설정할 경우, 아이콘 파일인 png 파일이 실행파일에 포함되므로, 실행시 이것을 tmp 디렉토리에 풀어서 이미지를 로딩하기 때문에 이미지 경로를 아래 코드와 같이 수정해야 한다.
try:
# sys.MEIPASS is temp directory for pyinstaller
icon_path = os.path.join(getattr(sys, '_MEIPASS'), "j1939.png")
except:
icon_path = os.path.join(os.path.abspath("."), "j1939.png")
self.__root.iconphoto(True, tkinter.PhotoImage(file=icon_path))
...