mm3344 发表于 2024-11-18 10:04

pyinstaller 打包exe报错求助

最近想写一个压缩视频的小程序,没打包前运行没问题,但是用pyinstaller打包后就报错,源码如下,求大神指点。
报错信息如图。
import tkinter as tkfrom tkinter import filedialog, messagebox
from moviepy.video.io.VideoFileClip import VideoFileClip


class VideoCompressorApp:
    def __init__(self, root):
      self.root = root
      self.root.title("视频压缩器")

      # 创建选择视频按钮
      self.select_button = tk.Button(root, text="选择视频文件", command=self.select_file)
      self.select_button.pack(pady=20)

      # 创建压缩按钮
      self.compress_button = tk.Button(root, text="压缩视频", command=self.compress_video, state=tk.DISABLED)
      self.compress_button.pack(pady=20)

      # 显示选择的文件路径
      self.file_path_label = tk.Label(root, text="")
      self.file_path_label.pack(pady=10)

      self.video_path = ""

    def select_file(self):
      self.video_path = filedialog.askopenfilename(filetypes=[("视频文件", "*.mp4 *.avi *.mov")])
      if self.video_path:
            self.file_path_label.config(text=self.video_path)
            self.compress_button.config(state=tk.NORMAL)

    def compress_video(self):
      if not self.video_path:
            messagebox.showerror("错误", "请先选择一个视频文件")
            return

      output_path = self.video_path.rsplit('.', 1) + "_compressed.mp4"

      try:
            with VideoFileClip(self.video_path) as video:
                video.write_videofile(output_path, bitrate="500k")# 设定压缩比特率

            messagebox.showinfo("成功", f"视频已压缩并保存为:\n{output_path}")
      except Exception as e:
            messagebox.showerror("错误", f"压缩视频时出错:{str(e)}")


if __name__ == "__main__":
    root = tk.Tk()
    app = VideoCompressorApp(root)
    root.mainloop()

sunyue2719 发表于 2024-11-18 10:53

使用PyInstaller的--hidden-import
pyinstaller --hidden-import=moviepy --hidden-import=moviepy.audio --hidden-import=moviepy.video your_script.py

22kGDS 发表于 2024-11-18 11:23

错误代码扔给AI分析一下就知道了

PJwail 发表于 2024-11-18 11:37

一般我都是给到GPT问下原因.....

ssslike 发表于 2024-11-18 13:50

根据错误栈看一下吧,不在你贴的代码里面

PaulLiang77 发表于 2024-11-18 14:00

PJwail 发表于 2024-11-18 11:37
一般我都是给到GPT问下原因.....

gpt怎么用呀

qq405228772 发表于 2024-11-18 14:52

import tkinter as tk
from tkinter import filedialog, messagebox
from moviepy.editor import VideoFileClip# 修正: 从moviepy.editor导入
class VideoCompressorApp:
    def __init__(self, root):
      self.root = root
      self.root.title("视频压缩器")
      # 创建选择视频按钮
      self.select_button = tk.Button(root, text="选择视频文件", command=self.select_file)
      self.select_button.pack(pady=20)
      # 创建压缩按钮
      self.compress_button = tk.Button(root, text="压缩视频", command=self.compress_video, state=tk.DISABLED)
      self.compress_button.pack(pady=20)
      # 显示选择的文件路径
      self.file_path_label = tk.Label(root, text="")
      self.file_path_label.pack(pady=10)
      self.video_path = ""
    def select_file(self):
      self.video_path = filedialog.askopenfilename(filetypes=[("视频文件", "*.mp4 *.avi *.mov")])
      if self.video_path:
            self.file_path_label.config(text=self.video_path)
            self.compress_button.config(state=tk.NORMAL)
    def compress_video(self):
      if not self.video_path:
            messagebox.showerror("错误", "请先选择一个视频文件")
            return
      output_path = self.video_path.rsplit('.', 1) + "_compressed.mp4"
      try:
            with VideoFileClip(self.video_path) as video:
                video.write_videofile(output_path, bitrate="500k")# 设定压缩比特率
            messagebox.showinfo("成功", f"视频已压缩并保存为:\n{output_path}")
      except Exception as e:
            messagebox.showerror("错误", f"压缩视频时出错:{str(e)}")
if __name__ == "__main__":
    root = tk.Tk()
    app = VideoCompressorApp(root)
    root.mainloop()

pyjiujiu 发表于 2024-11-18 15:05

压缩视频的小任务,没必要调用第三方库,直接调用ffmpeg 就行了,打包就非常简单了
只不过,ffmpeg 要另外下载,然后加到电脑 PATH 中去(这是很简单的,且对于工作机来说 是必备的)

*比如代码(AI写的,没写gui)


import subprocess
import pathlib

def compress_video(input_path, bitrate='500k'):
    input_path = pathlib.Path(input_path)
    output_path = input_path.with_stem('(compressed)' + input_path.stem)
   
    # ffmpeg 压缩命令
    cmd = [
      'ffmpeg',
      '-i', input_path,# 输入文件
      '-b:v', bitrate,   # 设置视频比特率为500k
      '-maxrate', f'{bitrate[:-1]}k',# 最大比特率与目标比特率相同
      '-bufsize', '1M',# 缓冲区大小
      '-y',# 覆盖输出文件
      output_path
    ]
   
    # 执行 ffmpeg 命令
    subprocess.run(cmd, check=True)
    print(f"视频已压缩到 {bitrate}{output_path.name}")

input_video = input('视频地址:').strip('"')
compress_video(input_video)
input('')

rootbot007 发表于 2024-11-19 13:49

总结一下就是ffmpeg 路径问题:
[*]错误信息显示与 moviepy 和 imageio 有关,尤其是在加载 ffmpeg 可执行文件时出错。
[*]imageio 的 get_ffmpeg_exe() 方法未能正确找到 ffmpeg 的路径,这可能是由于环境中未正确安装 ffmpeg 或路径未配置。

解决方法参考图片中的方法
页: [1]
查看完整版本: pyinstaller 打包exe报错求助