[python] pyinstaller 사용하기

JIN

November 3, 2021

pyinstaller

python을 실행하기 위해서는 기본적으로 가상환경 내에서 실행해야 한다. 매번 터미널창에서 가상환경에 접속하여 *.py로 실행하기에는 번거롭고 코드 파일 관리가 힘들기 때문에 *.exe를 생성하여 실행하는 방법을 추천한다.

실행 환경

pyinstaller 설치

# (venv) pip install -U pyintaller
# (venv) pip install -U pyinstaller-hooks-contrib

실행파일 생성

# (venv) pytinstaller {your_python}.py

pyinstaller 옵션

아래는 주로 사용하는 옵션이다

spec 파일을 통해 재빌드하기

이미 실행파일을 생성하였으나 옵션을 변경해야 할 경우가 있다. 이때 실행 명령어를 통해 새로 실행파일을 만들 필요가 없다. 다음은 옵션 변경에 대한 예시 상황이다.

  1. 파일 실행 시 ModuleNotFoundError 발생
  2. console 에 대한 옵션 변경
  3. 프로그램 이름 변경
  4. 아이콘 변경
  5. 라이브러리의 경로 변경

위와 같은 상황에서 옵션을 추가하여 pyinstaller 를 재실행하는 것은 상당히 번거롭지만, spec 파일 수정으로 간단히 재빌드 할 수 있다.

먼저 pyinstaller를 실행한 경로에서 {PROGRAM_NAME}.spec 파일을 찾아 열어본다. spec 파일 내부는 다음과 같다.

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


block_cipher = pyi_crypto.PyiBlockCipher(key='{PASSWORD}')


a = Analysis(['{실행하는 파이썬 파일명}.py'],
             pathex=['{프로젝트 경로}'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={},
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=True,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

exe = EXE(pyz,
          a.scripts, 
          [],
          exclude_binaries=True,
          name='{프로그램 파일명}',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None , icon='{아이콘 파일명}')
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas, 
               strip=False,
               upx=True,
               upx_exclude=[],
               name='{프로그램 파일명}')

이제 이 파일에서 옵션을 변경해 주면 된다.
예를 들어 파일 실행 시 ModuleNotFoundError 가 발생한 경우, hiddenimports=[] 의 리스트 안에 모듈명을 String으로 넣어 주면 된다.
spec 파일을 수정 후 다시 빌드하려면 다음 명령어 한 줄이면 빌드가 완료된다.

# (venv) pyinstaller -F {PROGRAM_NAME}.spec

에러 발생 대처