Pyinstaller 라이브러리를 활용하여 실행파일 만드는 법을 정리해 보겠습니다.
환경은 Window 10, Python (3.8.10 64-bit) 입니다. (아나콘다 X)
Pyinstaller는 프로그래밍, 파이썬에 대해 지식을 갖고 있지 않으신 분들이 파이썬으로 만들어진 프로그램을 코드 없이 쉽게 실행하여 사용할 수 있도록 만들어진 라이브러리 입니다.
제가 몇 번 사용해본 경험을 통해 장점과 단점을 간단히 정리해보았습니다.
장점
1. 파이썬 설치 없이 쉽게 사용 가능하다. (실행파일 실행하면 끝!)
2. 설치가 필요 없기 때문에 라이브러리 버전을 신경쓰지 않아도 된다.
3. 리눅스 환경에서도 비슷한 방법으로 활용 가능하다.
우선, 사용하려는 PC에서 실행파일을 받아 실행만 하면 되기 때문에, 파이썬 설치 같은 작업이 불필요하여 매우 편리하게 사용할 수 있습니다. 그렇기 때문에 실행시에는 라이브러리 버전을 신경쓰지 않아도 됩니다.
그리고 리눅스 환경에서도 실행파일이 생성되므로 같은 방식으로 사용할 수 있습니다.
단점
1. 실행 파일 생성 시 예기치 않은 에러가 발생한다.
2. torch 나 tensorflow 같은 무거운 라이브러리를 사용하게 되면 용량이 매우 커진다. (실행 속도도 느려진다)
단점은 실행파일을 만드는 데, 시간이 오래 걸릴수도 있고, 예기치 못한 에러가 발생하는 경우가 많습니다. (이것 때문에 애를 많이 먹고 있습니다.)
하나의 예시를 들면 필요한 패키지가 포함되지 않아 실행이 안되는 경우가 있습니다.
반대로 필요하지 않은 패키지가 포함되어 불필요하게 용량이 커지는 경우도 존재합니다.
이러한 경우에 어떻게 해야 하는지는 아래 내용에 적어두겠습니다.
그리고 파이썬의 설치를 필요로 하지 않기 때문에, 실행파일에 필요한 라이브러리를 다 담아두어야 해서, torch나 tensorflow같은 무거운 라이브러리를 사용할 시, 실행파일의 용량이 매우 커질 수가 있습니다.
그리고 그럴 경우에는 실행속도도 느려지게 됩니다.
1. 라이브러리 설치
설치는 pip install pyinstaller로 간단히 설치 가능합니다.
제가 사용한 버전은 5.5 버전입니다 (pip install pyinstaller==5.5)
2. 코드 작성
간단하게 코드를 작성해보았습니다.
def main():
print("hello")
if __name__ == "__main__":
main()
3. 실행파일 생성
생성하는 방법은 터미널 창에 pyinstaller 파일명.py 입력으로 간단하게 생성해줄 수 있습니다.
저는 pyinstaller test.py 명령어를 입력해주었습니다.
그럼 아래와 같이 폴더와 파일이 생성됩니다.
dist 폴더에 파일명(test) 폴더를 들어가게 되면 아래와 같이 실행파일이 생성된 것을 확인할 수 있습니다.
4. 실행파일 실행
실행파일을 더블클릭하여 실행하면 우리가 입력하였던 hello 가 프린트 되는 것을 확인할 수 있습니다.
5. 옵션
pyinstaller를 사용할 때 이용할 수 있는 옵션입니다.
터미널 창에 pyinstaller 라고 치시면 다양한 옵션들이 나오게 됩니다.
그 중에 사용해본 몇 가지를 정리해 드리겠습니다.
1) -F, --onefile
실행파일 하나로 생성해주는 옵션입니다. 해당 옵션을 사용하면 다른 사람에게 전달할 때 실행파일 하나만 전달해줘도 실행이 가능하게 됩니다.
대신 실행파일의 용량이 커지고 실행시간이 오래 걸리게 되는 단점이 존재합니다. (그래도 편리한 것 같습니다)
2) -w, --windowed, --noconsole
콘솔창을 표시하지 않겠다는 옵션입니다. (default는 표시하겠다)
만약 코드를 PyQt5같이 UI로 작성을 하였다면 해당 옵션을 통해 콘솔창을 띄우지 않게 하고 사용하시면 됩니다.
그렇지 않은 경우에는 console창으로 제대로 실행되고 있는지 확인하는 방법으로 사용할 수 있습니다.(print, icecream, logger 활용)
3) --distpath DIR
실행파일 생성 경로입니다. 저는 보통 --distpath=./ 을 사용하여 코드가 있는 곳에 바로 생성되도록 설정해서 사용합니다.
4) --collect-data MODULENAME
원하는 모듈(라이브러리)을 추가할 수 있는 옵션입니다.
실행파일을 만들어서 실행하였는데, No module 에러가 났을 때, 사용할 수 있습니다.
(ex : --collect-data xgboost)
5) --exclude-module EXCLUDES
원하는 모듈을 삭제할 수 있는 옵션입니다.
예를 들어 torch를 사용하지 않는데 추가되어서 용량이 매우 커졌을 경우에 해당 모듈을 제거하여 용량을 줄일 수 있습니다.
(ex : --exclude-module torch)
6) --version-file FILENAME
프로그램의 버전관리를 할 수 있는 옵션입니다.
우리가 흔히 프로그램 배포 시 활용할 수 있는 버전관리 옵션입니다.
아래 파일을 직접 수정해 보시면서 테스트 해보시면 도움이 될 것 같습니다.
7) -i, --icon
실행파일의 아이콘을 설정해주는 옵션입니다.
ico 확장자 아이콘을 받아서 지정해주면 됩니다.
--icon=./파일명.ico
6. 결과
위 옵션들 중 몇 개를 아래와 같이 설정하여 실행해 보겠습니다.
pyinstaller --distpath=./ --onefile --icon=./icon.ico --version-file=./file_version_info.txt test.py
아래 그림과 같이
코드가 있는 폴더에 실행파일이 생성되었고, 아이콘도 변경되었습니다.
그리고 실행파일 우클릭 -> 속성 -> 자세히 탭을 들어가보시면 버전이 나와 있는 걸 확인할 수 있습니다.
7. 추가
pyinstaller로 exe파일을 만들어서 실행하다보면
분명히 모듈을 포함시켰는데 모듈이 없다고 뜨는 경우가 있습니다.
저는 xgboost를 썼을 때 그런 경험을 했었는데, 아래 링크를 따라해서 해결했습니다.
https://github.com/pyinstaller/pyinstaller/commit/a11e82681b697b36b2690ffa8365acd130b8885d
Hooks/Xgboost - Bundles datas as well · pyinstaller/pyinstaller@a11e826
Fixes a runtime exception where xgboost requires additional data files that should be bundled with the application.
github.com
PyInstaller/hooks/hook-xgboost.py
포함시키길 원하는 module에 있는 모든 정보를 포함시키는 방법인 것 같습니다.
'프로그래밍 > Python' 카테고리의 다른 글
[파이썬, Python] csv 파일 불러오기 (open, close, with) (0) | 2023.01.17 |
---|---|
[파이썬, Python] 텍스트 파일 불러오기 (open, close, with) (0) | 2023.01.17 |
[파이썬, Python] plot style 변경 (0) | 2023.01.17 |
[파이썬, Python] 이중 for 문 한 줄로 만들기 (0) | 2023.01.17 |
[파이썬, Python] log 남기기 (logging, VSCode) (0) | 2022.10.23 |