✅ 📦 1단계: 빌드 준비 체크리스트
1️⃣ 불필요한 테스트/개발 코드 정리
- testcodes/, __pycache__/, 임시 로그파일 제거
- 미사용된 legacy 함수 삭제 (이미 resolve_drive_path 정리처럼 진행하셨음 👍)
2️⃣ 로컬 캐시 디렉토리 초기화
- cache/drive_audio/, cache/tts_audio/ 등 초기상태로 두거나 .gitignore 등록
3️⃣ .env 또는 config.ini로 민감정보 분리 (필요시)
- 구글 API 키, Telegram 토큰 등
4️⃣ requirements.txt 최종 정리
pip freeze > requirements.txt
그 외,
경로처리하는 부분이 아래처럼 되어있다면, 에러가 날 확률이 높다.
os.path.dirname(__file__)
import sys
import os
def get_resource_path(relative_path):
"""패키징된 exe 환경에서도 제대로 경로 반환하는 함수"""
if hasattr(sys, '_MEIPASS'):
# PyInstaller 빌드된 exe 환경
base_path = sys._MEIPASS
else:
# 개발 환경
base_path = os.path.dirname(os.path.abspath(__file__))
return os.path.join(base_path, relative_path)
이렇게 작성해야함.
이미 작성된 코드들에서는 이렇게 사용.
from utils import get_resource_path
config_path = get_resource_path("config/config.yaml")
sound_path = get_resource_path("sounds/beep.mp3")
✅ 🛠️ 2단계: 실행 빌드 스크립트 정비
1️⃣ start_radio.py 내 main entry 재점검
- if __name__ == "__main__": 블록 포함 여부 확인
- CLI 실행 가능하게 되어 있는지
2️⃣ PyInstaller 빌드 설정
이미 start_radio.spec 있다면 아래 커맨드로 빌드:
pyinstaller start_radio.spec
💡 또는 minimal 빌드 테스트용:
pyinstaller --onefile start_radio.py
폴더를 추가해야한다면, --add-data "파일경로"
여기서 삽질을 좀 많이 해야하더라... 자세한건 다음포스팅..
✅ 💬 3단계: 배포/운영 자동화 준비
1️⃣ run.bat or run.sh 배치 스크립트 작성 (자동 시작용)
bat
복사편집
@echo off echo Starting Buffer Radio... radioEnv\Scripts\activate python start_radio.py
2️⃣ 로그 자동 백업 + 순환 시스템
- 로그 디렉토리 logs/가 너무 커지지 않도록 순환 시스템 (e.g. RotatingFileHandler)
✅ 🔐 4단계: 운영 환경 테스트 및 최종 검수
- 다양한 버퍼 시트에서 오류 없이 동작하는지
- 24시간 무중단 테스트 (시보 → 루프 → 캐시 재생)
- Google Drive API 한도 초과 대비 (잘 되고 있음 👍)
- SSL/네트워크 불안정 상황 복구 확인
728x90
'개발로그 > Python' 카테고리의 다른 글
Mac에서는 .exe 파일이 절대 실행되지 않습... mac 버전으로 빌드 만드는 방법 (0) | 2025.03.27 |
---|---|
윈도우 환경에서 10시간 이상 프로그램을 동작하게 해보자. (0) | 2025.03.27 |
pyinstaller 반드시 추가해야할 필수 옵션 리스트 (0) | 2025.03.26 |
pyinstaller 패키지가 자꾸 누락될 때, (0) | 2025.03.25 |
PyInstaller 로 .exe 만들기 간단 요약 (윈도우 기준), 경로 설정 방법 (0) | 2025.03.23 |
anaconda + python 완전히 지우는 방법. (0) | 2025.03.22 |
없어져라! SSL 문제 해결을 위한 실전 대응 북 (0) | 2025.03.16 |
random.choice()와 random.shuffle()은 비슷해 보이지만 목적이 완전히 다르다 (0) | 2025.03.15 |
댓글