우아한 프로그래밍
article thumbnail

왜 그럴까?

이유는 간단하다
파이참에서 읽을 때와 pyinstaller로 배포한 상태에서 읽는 것이 다르기 때문이다.

코드에서는 그럼 어떻게 해결해?

아래 코드를 보자.
코드를 살펴보면 배포되었을 때와 파이참에서 실행 중일때의 코드가 분기문으로 처리되고 있다.
해당 코드를 유틸로 만들어서 사용하면 좋을 듯하다.

if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
    # 배포되었을 때 
    # When running in a PyInstaller bundle
    base_path = sys._MEIPASS
    print('Running in a PyInstaller bundle')
else:
    # 파이참에서 실행 할 때
    # When running in a normal Python process
    base_path = os.path.abspath(".")
    print('Running in a normal Python process')

ui_file = os.path.join(base_path, 'ui', 'main.ui')
form_class = uic.loadUiType(ui_file)[0]

이제 빌드는 어떻게 해야하지?

먼저 프로젝트 루트에서 아래와 같은 명령어를 실행하면

pyinstaller -F main.py

main.spec이라는 파일이 만들어진다. 그 이후 부터는 위의 명령어는 절대 쓰지 말자 ( 쓰면 main.spec이 재생성되서 덮어쓰기 됨)
이후 부터는 아래 명령어를 사용하자

pyinstaller main.spec -y

-y를 붙여줌으로써 이미 빌드된 파일이 있으면 지우고 다시 빌드하라는 명령어다.

빌드하기 전에 spec 파일에서는 아래 코드 처럼 포함하고자 하는 리소스들을 적어주면 된다.
datas=[('ui/main.ui', 'ui'), ('user_agent.txt', '.'), ('proxy.txt', '.')],

a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[('ui/main.ui', 'ui'), ('user_agent.txt', '.'), ('proxy.txt', '.')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='main',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='main'
)

빌드된 결과물은?

profile

우아한 프로그래밍

@자바조아!

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!