脚本被 PyInstaller 打包后,若仍用 __file__ 推路径,常会落到 %TEMP%\_MEIxxxx。配置、日志、同目录资源就会“找不到”。

写法

import os, sys, logging

def get_script_dir() -> str:
    if getattr(sys, "frozen", False):
        return os.path.dirname(sys.executable)
    return os.path.dirname(os.path.abspath(__file__))

def main(logger=None):
    logger = logger or logging.getLogger("app")
    current_dir = get_script_dir()
    logger.info("当前工作目录: %s", current_dir)
    config_path = os.path.join(current_dir, "config.json")

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    main()

区分两种资源

  • 与 exe 同目录的用户文件(配置、输出):用 get_script_dir()
  • 打进包内的静态资源(图标、模板):用 sys._MEIPASS

注意:不要把用户可改配置写进 _MEIPASS;那是临时解包目录,退出后可能消失。