Pyinstaller打包程序的运行目录不是当前目录


  • 代码中的一个片段
python
# 配置常量
FFMPEG_DIR = os.path.join(os.path.dirname(__file__), "ffmpeg")  # 本地ffmpeg目录
SUPPORTED_FORMATS = ['.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv']  # 扩展支持格式

def setup_ffmpeg():
    """配置本地FFmpeg路径"""
    if sys.platform.startswith('win'):
        ffmpeg_path = os.path.join(FFMPEG_DIR, 'ffmpeg.exe')
        ffprobe_path = os.path.join(FFMPEG_DIR, 'ffprobe.exe')
    else:
        ffmpeg_path = os.path.join(FFMPEG_DIR, 'ffmpeg')
        ffprobe_path = os.path.join(FFMPEG_DIR, 'ffprobe')

    # 验证文件是否存在
    if not all(os.path.isfile(p) for p in [ffmpeg_path, ffprobe_path]):
        print("错误: 找不到本地FFmpeg组件,请确保存在以下文件:")
        print(f" - {ffmpeg_path}")
        print(f" - {ffprobe_path}")
        sys.exit(1)

    # 修改moviepy全局配置
    change_settings({"FFMPEG_BINARY": ffmpeg_path,
                    "FFPROBE_BINARY": ffprobe_path})
  • 文件是在当前目录下的,打包成 exe 后运行,出现报错如下:
D:\01_资料\xxx\完成版>01v2s.exe videos
错误: 找不到本地FFmpeg组件,请确保存在以下文件:
 - C:\Users\xxx\AppData\Local\Temp\_MEI169042\ffmpeg\ffmpeg.exe
 - C:\Users\xxx\AppData\Local\Temp\_MEI169042\ffmpeg\ffprobe.exe
  • 也就是说运行时的目录是一个 Temp 目录,而不是当前目录,想要调用这个目录,需要在编译的时候添加如下选项:
--add-data "ffmpeg;ffmpeg" \
  • --add-data "ffmpeg;ffmpeg" 表示:
    • 第一个 ffmpeg 是本地文件夹路径
    • 第二个 ffmpeg 是打包后程序内的目标路径
  • 在 Windows 上用 ; 分隔路径,Linux/macOS 用 :

别卷了 2025年4月15日 13:37 收藏文档