왜 그럴까?
이유는 간단하다
파이참에서 읽을 때와 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'
)
빌드된 결과물은?
'프로그래밍 > 파이썬' 카테고리의 다른 글
파이썬에서 pyinstaller를 간단하게 실행하는 방법. (0) | 2024.05.22 |
---|