# app/config/path_conf.py import os import sys from pathlib import Path # ===================== 关键:检测打包环境 ===================== # PyInstaller 打包后会设置 sys.frozen 属性,sys._MEIPASS 是临时解压目录 is_packaged = getattr(sys, 'frozen', False) MEIPASS_DIR = Path(sys._MEIPASS) if is_packaged else Path('.') # ===================== 适配 BASE_DIR ===================== if is_packaged: # 打包后:BASE_DIR 指向可执行文件所在目录(而非临时目录,方便读取外部配置) BASE_DIR = Path(os.path.dirname(os.path.abspath(sys.executable))) else: # 开发环境:沿用原逻辑(基于__file__推导项目根目录) BASE_DIR = Path(__file__).parent.parent.parent # ===================== 原有路径定义(仅适配静态文件/配置路径) ===================== # alembic 迁移文件存放路径(打包后若需迁移,需手动复制到BASE_DIR) ALEMBIC_VERSION_DIR = BASE_DIR / 'app' / 'alembic' / 'versions' # 日志文件路径(打包后日志输出到可执行文件同级logs目录) LOG_DIR = BASE_DIR / 'logs' # 静态资源目录(优先级:1.可执行文件同级static 2.临时目录内static) STATIC_DIR = BASE_DIR / 'static' if is_packaged and not STATIC_DIR.exists(): STATIC_DIR = MEIPASS_DIR / 'static' # 上传/下载文件目录 UPLOAD_DIR = STATIC_DIR / 'upload' DOWNLOAD_DIR = STATIC_DIR / 'download' # 环境配置目录(核心:打包后读取可执行文件同级的env文件夹) ENV_DIR = BASE_DIR / 'env' # 兜底:若外部无env文件夹,读取打包嵌入的env(临时目录内) if is_packaged and not ENV_DIR.exists(): ENV_DIR = MEIPASS_DIR / 'env' # 初始化脚本(打包后仅保留临时目录内的脚本,若需运行时修改需手动复制) SCRIPT_DIR: Path = MEIPASS_DIR / 'app' / 'scripts' / 'data' if is_packaged else BASE_DIR / 'app' / 'scripts' / 'data' # 模版文件配置(打包后从临时目录读取,静态模版无需外部修改) TEMPLATE_DIR: Path = MEIPASS_DIR / 'app' / 'api' / 'v1' / 'module_generator' / 'gencode' / 'templates' if is_packaged else BASE_DIR / 'app' / 'api' / 'v1' / 'module_generator' / 'gencode' / 'templates' # banner.txt 文件路径(优先级:1.外部BASE_DIR 2.临时目录) BANNER_FILE = BASE_DIR / 'banner.txt' if (BASE_DIR / 'banner.txt').exists() else MEIPASS_DIR / 'banner.txt' # ===================== 自动创建必要目录(避免运行时报错) ===================== for dir_path in [LOG_DIR, STATIC_DIR, UPLOAD_DIR, DOWNLOAD_DIR, ENV_DIR]: dir_path.mkdir(exist_ok=True, parents=True)