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
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기