본문 바로가기
코딩취미/Python

pyinstaller .spec 파일 사용 방법 (Analysis, PYZ, EXE)

by 브링블링 2024. 4. 6.
반응형

pyinstaller .spec 파일 사용 방법 (Analysis, PYZ,  EXE)

.spec 파일은 PyInstaller로 패키징 과정을 제어하는 설정 파일입니다. 이 파일은 PyInstaller가 프로젝트를 분석하여 생성하며, 패키징 과정에서 사용되는 다양한 옵션과 설정을 정의합니다. .spec 파일을 통해 실행 파일 생성에 필요한 스크립트, 데이터 파일, 바이너리 파일 등을 상세하게 지정할 수 있으며, 복잡한 패키징 요구 사항을 충족시키기 위한 고급 설정을 제공합니다.

 

기능과 특징

  • 세밀한 설정 제공: .spec 파일을 통해 빌드 프로세스의 세밀한 부분까지 제어할 수 있습니다.
  • 커스터마이징 가능: 사용자는 .spec 파일을 직접 수정하여 커스텀 빌드 스크립트를 작성할 수 있습니다.
  • 복잡한 프로젝트 지원: 여러 스크립트 파일, 추가 데이터 및 바이너리 파일을 포함해야 하는 복잡한 프로젝트에 적합합니다.
  • 재사용 가능: 한 번 설정한 .spec 파일은 같은 프로젝트의 다른 빌드나 유사한 프로젝트에 재사용할 수 있습니다.

용도

  • 복잡한 의존성을 가진 애플리케이션의 패키징
  • 추가 데이터 파일과 바이너리 파일을 포함하는 애플리케이션의 빌드
  • 빌드 프로세스 중 특정 스크립트 실행이 필요한 경우
  • 프로젝트에 맞춤형 빌드 옵션을 적용하고자 할 때

.spec 파일 내부 구성  요약 : Analysis, PYZ, EXE

각 구성의 상세한 내용은 아래쪽에 다시 정리해놓았습니다.

 

Analysis 기능과 용도

Analysis 객체는 PyInstaller가 실행 파일을 생성하기 위해 필요한 정보를 수집하는 단계를 담당합니다. 이는 스크립트의 종속성 분석, 필요한 바이너리 파일과 데이터 파일의 목록 작성, 숨겨진 import의 탐지 등을 포함합니다.

  • 기능과 용도:
    • Python 스크립트의 의존성을 분석합니다.
    • 포함될 바이너리와 데이터 파일을 결정합니다.
    • 스크립트에서 직접적으로 참조하지 않은 숨겨진 import를 탐지합니다.
    • 패키징할 애플리케이션의 구조를 결정하는 초기 단계입니다.

PYZ 기능과 용도

PYZ 객체는 분석 단계에서 수집된 Python 스크립트와 모듈을 하나의 압축된 아카이브로 묶는 역할을 합니다. 이 아카이브는 실행 시 애플리케이션에 포함된 Python 코드를 로드하는 데 사용됩니다.

  • 기능과 용도:
    • 분석 결과로 얻은 Python 파일들을 압축하여 .pyz 아카이브를 생성합니다.
    • 실행 시 Python 코드의 로딩 속도를 향상시킵니다.
    • 코드 보호를 위해 선택적으로 암호화를 적용할 수 있습니다.

EXE 기능과 용도

EXE 객체는 최종 실행 파일을 생성하는 단계를 담당합니다. 이는 PYZ 아카이브, Python 인터프리터, 필요한 바이너리 파일들을 하나의 실행 가능한 패키지로 묶습니다.

  • 기능과 용도:
    • 압축된 Python 코드, Python 인터프리터, 필요한 모든 바이너리와 데이터 파일을 하나의 실행 파일로 묶습니다.
    • 단일 파일(--onefile) 또는 폴더 기반(--onedir) 실행 파일 생성을 지원합니다.
    • 실행 파일에 대한 추가 설정을 제공합니다(예: 아이콘 지정, 디버그 모드 활성화).

.spec 파일 사용 방법

1. 기본 .spec 파일 생성: PyInstaller를 처음 실행할 때, 지정한 Python 스크립트에 기반하여 .spec 파일이 자동으로 생성됩니다. 아래 명령은 your_script.spec 파일을 생성합니다.

pyinstaller your_script.py

2. .spec 파일 수정: 생성된 .spec 파일을 텍스트 에디터로 열고 필요한 변경을 적용합니다. 예를 들어, 추가 데이터 파일이나 바이너리 파일을 포함하거나, 특정 PyInstaller 옵션을 설정할 수 있습니다.

 

(아래 코드에서는 Analysis 객체의 datas 속성은 추가적으로 포함할 데이터 파일을 지정합니다. 각 항목은 (소스, 대상) 튜플로 구성되며, 여기서는 config.inilogo.png 파일을 data 폴더에 포함시키고 있습니다.)

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['your_script.py'],
             pathex=['path_to_your_script'],
             binaries=[],
             datas=[('data/config.ini', 'data'), ('data/logo.png', 'data')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='your_application',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )

 

3. 수정된 .spec 파일로 빌드: 변경사항을 적용한 .spec 파일을 사용하여 PyInstaller 빌드를 실행합니다.

pyinstaller your_script.spec

 

반응형

.spec 파일 내부 구성 사용방법 : Analysis, PYZ, EXE

Analysis 상세 내용

Analysis 객체는 PyInstaller의 .spec 파일에서 가장 중요한 부분 중 하나로, 실행 파일을 생성하기 위해 필요한 초기 분석 단계를 담당합니다. 여기에는 스크립트의 의존성 분석, 필요한 파일들의 목록 작성, 숨겨진 import의 탐지 등이 포함됩니다. Analysis 객체는 패키징할 애플리케이션의 구조를 결정하는데, 이 구조는 후속 단계에서 사용됩니다.

Analysis 객체의 주요 항목

  • scripts: 패키징할 Python 스크립트의 목록입니다. 주로 진입점이 되는 스크립트 파일들을 지정합니다.
  • pathex: Python 모듈을 검색할 경로의 목록입니다. 이 경로들은 스크립트의 종속성을 찾는 데 사용됩니다.
  • binaries: 추가적인 바이너리 파일들을 명시적으로 지정합니다. 각 항목은 (소스, 대상) 튜플 형식으로 지정되며, 패키징 과정에서 이 파일들이 실행 파일에 포함됩니다.
  • datas: 추가적인 데이터 파일들을 지정합니다. 이것도 (소스, 대상) 튜플 형식으로, 예를 들어 설정 파일이나 외부 리소스 파일을 지정할 때 사용됩니다.
  • hiddenimports: PyInstaller가 자동으로 감지하지 못하는 숨겨진 종속성을 명시적으로 지정합니다. 특정 모듈이 동적으로 import되는 경우 유용합니다.
  • excludes: 패키징 과정에서 제외할 모듈의 목록입니다. 불필요한 모듈을 제거하여 최종 실행 파일의 크기를 줄일 수 있습니다.
  • hookspath: 사용자 정의 훅 스크립트의 경로를 지정합니다. PyInstaller의 기본 훅 외에 추가적인 훅을 정의할 수 있습니다.
  • runtime_hooks: 런타임에 실행될 훅 스크립트의 목록입니다. 애플리케이션이 시작할 때 특정 코드를 실행해야 할 경우 사용됩니다.

아래 코드에서는 main.py를 주 스크립트로 하여 애플리케이션을 패키징합니다. 추가적인 바이너리(binary.dll), 데이터 파일(config.inilogo.png), 그리고 숨겨진 종속성(some_hidden_module)을 지정하고, 특정 모듈(unnecessary_module)을 제외하고 있습니다.

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['main.py'],
             pathex=['/path/to/application'],
             binaries=[('additional/binary.dll', 'bin')],
             datas=[('data/config.ini', 'data'), ('images/logo.png', 'images')],
             hiddenimports=['some_hidden_module'],
             hookspath=[],
             runtime_hooks=[],
             excludes=['unnecessary_module'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='my_application', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True)

 

PYZ 상세 내용

PYZ 객체는 PyInstaller .spec 파일에서, Analysis 단계를 통해 분석된 Python 스크립트와 모듈을 하나의 압축된 아카이브(.pyz 파일)로 만드는 역할을 합니다. 이 아카이브는 실행 시 애플리케이션에 포함된 Python 코드를 로드하는 데 사용됩니다. PYZ 객체 생성은 패키지된 애플리케이션의 크기를 최적화하고, 로딩 시간을 단축하며, 코드 보호를 위한 선택적 암호화를 제공할 수 있습니다.

PYZ 객체의 주요 항목

  • a.pure: Analysis 객체에서 분석된 순수 Python 파일 목록입니다. 이 파일들은 압축 과정을 통해 .pyz 아카이브에 포함됩니다.
  • a.zipped_data: Analysis 객체에서 이미 압축된 형태로 제공되는 데이터입니다. 이 데이터는 .pyz 아카이브에 그대로 포함됩니다.
  • cipher: 선택적으로 코드를 암호화하는 데 사용될 암호화 알고리즘을 지정합니다. 이는 block_cipher 객체를 통해 설정할 수 있으며, 애플리케이션의 코드 보호를 강화하는 데 사용될 수 있습니다.

아래 코드에서는 main.py 파일을 포함하여 애플리케이션을 패키징하는 과정을 단계별로 설명합니다. Analysis 객체를 통해 의존성을 분석하고, PYZ 객체를 생성하여 분석된 Python 스크립트와 모듈을 압축합니다. 마지막으로 EXE 객체를 통해 최종 실행 파일을 생성합니다. block_cipher는 여기서 None으로 설정되어 있으므로, 코드 암호화는 적용되지 않습니다.

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['main.py'],
             pathex=['.'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data,
          cipher=block_cipher)

exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='my_application',
          debug=False,
          strip=None,
          upx=True,
          console=True)

 

 

EXE 상세 내용

EXE 객체는 PyInstaller의 .spec 파일에서 최종 실행 파일을 생성하는 단계를 담당합니다. 이 객체는 PYZ 객체를 포함하여, 필요한 모든 스크립트, 바이너리 파일, 데이터 파일들을 하나의 실행 가능한 패키지로 묶습니다. EXE 객체는 애플리케이션의 실행 파일에 대한 다양한 설정을 제공하며, 특히 단일 파일 실행 옵션, 콘솔 모드 설정, 아이콘 지정 등을 설정할 수 있습니다.

EXE 객체의 주요 항목

  • pyz: PYZ 객체로부터 생성된 압축된 Python 코드 아카이브입니다. 이는 실행 파일 내에서 Python 코드를 로드하는 데 사용됩니다.
  • scripts: Analysis 객체에서 분석된 스크립트 목록입니다. 이 스크립트들은 실행 파일에 포함됩니다.
  • binaries: 추가적인 바이너리 파일들을 포함시킵니다. 이는 외부 라이브러리나 모듈 등에 해당될 수 있습니다.
  • datas: 추가적인 데이터 파일들을 포함시킵니다. 설정 파일, 리소스 파일 등이 여기에 해당됩니다.
  • name: 생성될 실행 파일의 이름입니다.
  • debug: 디버그 모드를 활성화할지 여부를 설정합니다. 디버그 모드가 활성화되면, 실행 중 발생하는 내부 메시지들이 출력됩니다.
  • strip, upx: 실행 파일의 크기를 최적화하기 위한 설정입니다. strip은 심볼 테이블 제거를, upx는 UPX 압축을 의미합니다.
  • console: 실행 파일이 콘솔 애플리케이션으로 생성될지, 또는 GUI 애플리케이션으로 생성될지를 결정합니다. True 설정은 콘솔 애플리케이션을 의미합니다.

아래의 코드는 main.py를 기반으로 한 애플리케이션을 패키징하는 과정을 보여줍니다. Analysis 객체를 사용하여 의존성을 분석하고, PYZ 객체로 Python 코드를 압축한 후, EXE 객체를 통해 최종 실행 파일을 생성합니다. 여기서는 실행 파일 이름을 "MyApplication"으로 지정하고, console=True 옵션을 사용하여 콘솔 애플리케이션으로 생성합니다. 또한, icon='app_icon.ico' 옵션으로 애플리케이션의 아이콘을 지정합니다.

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['main.py'],
             pathex=['.'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name="MyApplication",
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True,  # 콘솔 애플리케이션으로 생성
          icon='app_icon.ico')  # 애플리케이션 아이콘 지정

 

반응형