Priv's Blog

Pyinstaller 기초 사용법 본문

Dev. Study Note/Python

Pyinstaller 기초 사용법

Priv 2023. 8. 3. 23:42


 

 

1. Pyinstaller

Python은 인터프리터(Interpreter)를 사용하는 대표적인 언어입니다.

즉, 컴파일러(Compiler)를 사용하는 언어와 달리, 소스 코드 파일을 한꺼번에 전부 번역을 해둔 뒤에 실행하는 것이 아니라 소스 코드를 실행하면 실시간으로 번역하는 방식입니다.

이러한 인터프리터 방식은 컴파일 방식보다 개발 속도가 빨라져서 이점도 많지만, 그렇다고 항상 좋은 것만은 아닙니다.

당연하겠지만 Python은 다른 언어와 달리 '컴파일'이라는 개념이 없습니다.

즉, '바로 실행할 수 있도록 소스 코드를 미리 번역해 둔 결과물'이라는 개념이 없습니다.

IDE에서 코드를 다 짰으면 Python을 설치하지 않은 환경에서도 프로그램을 실행할 수 있도록 만들어 배포해야 하는데, 여기서 좀 난감해지죠.

이런 상황에서 유용하게 쓸 수 있는 라이브러리가 Pyinstaller입니다.


 

PyInstaller Manual — PyInstaller 5.13.0 documentation

PyInstaller bundles a Python application and all its dependencies into a single package. The user can run the packaged app without installing a Python interpreter or any modules. PyInstaller supports Python 3.7 and newer, and correctly bundles many major P

pyinstaller.org


macOS, Windows, Linux 전부 지원합니다.

 


 

2. 빌드하기

Pyinstaller는 pip를 통해서 설치 후 사용할 수 있습니다.

설치법에 대해서는 공식 홈페이지에 상세하게 설명되어 있습니다.

Python으로 작성한 소스 코드 파일은 .py 확장자를 가집니다.

main.py 파일을 빌드하기 위해서는 터미널 창에서 해당 파일이 있는 경로로 이동한 뒤, 다음과 같이 작성합니다.

pyinstaller main.py

가장 기본적인 빌드 방식입니다.

빌드에 성공했다면 여러 폴더와 파일들이 생성될 것입니다.

여기서 main() 메서드가 존재하는 .py 파일 이름을 작성해야 함에 주의합니다.

여기에 아래와 같이 여러 옵션도 적용해 줄 수 있습니다.

 

- 1개의 프로그램 파일로 합쳐서 빌드되도록 설정

pyinstaller -F main.py

pyinstaller는 대소문자를 구별합니다.

-F는 --onefile로 대체될 수 있습니다.

이 설정으로 빌드하면 생성된 폴더 중 dist 폴더를 열어보면 1개의 응용프로그램만 덩그러니 있을 것입니다.

 

- 프로그램을 실행할 때 표시되는 터미널 창이 뜨지 않도록 설정

pyinstaller -w main.py

-w는 --noconsole로 대체될 수 있습니다.

프로그램을 실행할 때마다 함께 열리는 터미널(콘솔) 창을 뜨지 않도록 설정합니다.

...블렌더 3D도 이 옵션으로 빌드해보고 싶네요. 터미널 창 엄청 거슬리던데...

 

- 프로그램 아이콘을 자신이 원하는 이미지로 설정

pyinstaller --icon=(파일경로명) main.py

(파일경로명) 부분은 자신이 사용하려는 ico 파일의 경로명으로 작성합니다.

물론, 소괄호도 작성하지 않습니다.

 


 

3. 빌드 시, 외부 리소스 첨부하기

파트 2의 내용만으로는 많이 부족합니다.

빌드하려는 프로그램이 외부 리소스(사진, txt 파일 등)를 사용하고 있다면 꽤나 골치가 아플 수 있습니다.

파트 2의 내용만으로 빌드를 진행하면 외부 리소스 파일 경로를 찾지 못해서 에러를 내뿜기 때문입니다.

당연히, 해결 방법은 있습니다.


 

 

Adding a data file in Pyinstaller using the onefile option

I'm trying to add an image to the one file produced by Pyinstaller. I've read many questions/forums like this one and that one and still it's not working. I know that for one file operation, Pyins...

stackoverflow.com


Pyinstaller를 사용해 단일 파일로 빌드를 한 뒤에 프로그램을 실행하면 로컬 저장소의 TEMP 디렉터리에 폴더를 풀어놓습니다. 

스크립트 파일을 실행하고 나면 해당 임시 파일들은 삭제되죠.

외부 리소스를 정상적으로 불러와 사용하도록 만들기 위해서는 프로그램을 실행할 때마다 임시 폴더의 경로를 바꿔주어야 합니다.

기본적으로 설정된 임시 폴더의 경로는 sys._MEIPASS를 통해 알아낼 수 있습니다.

코드를 바꿔봅시다.

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)

def main() :
    words_en_path = resource_path("Unit 1/Words_EN.txt")
    words_kor_path = resource_path("Unit 1/Words_KOR.txt")
    sentences_en_path = resource_path("Unit 1/Sentences_EN.txt")
    sentences_kor_path = resource_path("Unit 1/Sentences_KOR.txt")

    with open(words_en_path) as words :     ## 영단어
        words_en = words.readlines()

    with open(words_kor_path) as words :    ## 한국어 단어
        words_kor = words.readlines()

    with open(sentences_en_path) as sentences :    ## 영문장
        sentences_en = sentences.readlines()

    with open(sentences_kor_path) as sentences :   ## 한국어 문장
        sentences_kor = sentences.readlines()

간단한 메서드를 하나 추가하였습니다.

이제 빌드를 할 때 옵션을 설정해야 합니다.

아까처럼 터미널을 켜고 파일이 있는 폴더로 이동해 아래와 같이 코드를 작성합니다.

pyinstaller --onefile --add-data="Unit 1/*.txt;Unit 1/" main.py

--add-data는 파트 2에서 언급되지 않은 옵션입니다.

해당 옵션은 빌드를 할 때 함께 빌드할 파일들을 지정하는 옵션입니다.

세미콜론( ; )을 기준으로 왼쪽에 위치한 경로는 개발을 진행할 때 사용한 리소스의 경로를 작성합니다.

오른쪽에 위치한 경로는 빌드를 마쳤을 때 저장될 리소스의 경로를 작성합니다.

위의 코드는 --onefile 옵션을 함께 사용했기 때문에 해당 리소스들이 빌드 후에 생성된 dist 폴더 또는 build 폴더에 직접적으로 노출되지는 않습니다.

 


 

4. 프로그램 실행 및 배포하기

완성된 프로그램은 dist 폴더 안에 저장됩니다.

--onefile 또는 -F 옵션을 적용했다면 응용프로그램 하나만 덩그러니 놓여있을 것입니다.

해당 파일을 더블 클릭하면 설정한 옵션에 맞게 프로그램이 실행됩니다.

실행했을 때 에러가 표시되지 않는다면 성공입니다.

다른 사람에게 프로그램을 배포할 때는 dist 폴더 안에 있는 실행 프로그램을 제공하면 됩니다.

 


 


수고하셨습니다!


Comments