728x90
반응형
🎯 PyInstaller 빌드 후 settings.json 경로 이슈 해결 기록
문제
- PyInstaller 빌드 후 실행 시 settings.json이 exe 경로가 아닌 _internal 경로에 생성됨
- _internal은 읽기 전용이라 설정 저장/불러오기 작동 안함
원인
- resource_path()에서 sys._MEIPASS를 사용하여 리소스와 유저 데이터 경로를 구분 없이 처리했기 때문
해결
- 리소스(icon, version.txt 등) → resource_path()에서 _MEIPASS 경로 사용
- 유저 데이터(settings.json) → settings_path() 함수 추가, sys.executable 기준 exe 경로 사용
def resource_path(relative_path):
"""
PyInstaller 환경 및 개발 환경 모두에서 리소스(icon, version.txt) 경로 반환용
"""
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
def settings_path():
"""
settings.json 경로: exe 경로(또는 개발 경로)에서 항상 관리되도록
"""
if getattr(sys, 'frozen', False):
# PyInstaller 실행 중이면 exe의 경로를 사용
return os.path.join(os.path.dirname(sys.executable), "settings.json")
else:
# 개발 환경이면 현재 경로 사용
return os.path.join(os.path.abspath("."), "settings.json")
def load_settings():
path = settings_path()
if not os.path.exists(path):
with open(path, 'w', encoding='utf-8') as f:
json.dump(DEFAULT_SETTINGS, f, ensure_ascii=False, indent=4)
return DEFAULT_SETTINGS
with open(path, 'r', encoding='utf-8') as f:
return json.load(f)
def save_settings(settings):
path = settings_path()
with open(path, 'w', encoding='utf-8') as f:
json.dump(settings, f, ensure_ascii=False, indent=4)
결과
✅ 빌드 후 실행 시 settings.json이 exe 경로에만 생성 및 사용
✅ 설정 저장/불러오기 정상 작동
✅ 개발 환경과 빌드 환경 모두 동일하게 작동
728x90
반응형
'배움 - 차근차근 기록하자 > [개발] 파이썬 🍕' 카테고리의 다른 글
PyQT5 컨트롤 크기 변경에 따른 윈도우 사이즈 변경, 바로 반영하기 (0) | 2023.11.01 |
---|---|
[pyinstaller] 명령어 , Anaconda 용량 줄이기 팁 (0) | 2023.10.06 |
[파이썬] 내가 보려고 정리한 파이썬 문법들 (0) | 2023.05.18 |
[splitfolders] 이미지 폴더를 Train, Valid, Test로 나눠주는 라이브러리 (0) | 2023.03.15 |