python使用moviepy包下的VideoFileClip时报错:OSError: [WinError 6] 句柄无效解决方法

本文解决了一个在连续读取多个视频文件时,使用moviepy的VideoFileClip获取视频时长出现的错误。通过在读取每个视频后关闭资源,避免了因资源未释放导致的后续读取失败问题。

在使用moviepy包下的VideoFileClip获取视频时长,在连续获取了若干个视频时长之后,突然报错:

Traceback (most recent call last):
  File "e:\Videos\get_video_duration.py", line 67, in <module>
    run()
  File "e:\Videos\get_video_duration.py", line 62, in run
    gen_video_duration()
  File "e:\Videos\get_video_duration.py", line 49, in get_video_duration
    duration = time_convert(get_video_times(os.path.join(root,i)))
  File "e:\Videos\gen_video_duration.py", line 26, in get_video_times
  File "D:\ProgramData\Anaconda3_x64\lib\site-packages\moviepy\video\io\VideoFileClip.py", line 91, in __init__
    fps_source=fps_source)
  File "D:\ProgramData\Anaconda3_x64\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 69, in __init__
    self.initialize()
  File "D:\ProgramData\Anaconda3_x64\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 104, in initialize
    self.proc = sp.Popen(cmd, **popen_params)
  File "D:\ProgramData\Anaconda3_x64\lib\subprocess.py", line 6
使用 nnUNet ,遇到 `OSError: [WinError 6] 句柄无效` 的问题,通常与 Windows 系统下多进程操作或资源释放异常有关。此类错误可能出现在数据预处理、训练或推理阶段,尤其是在使用多线程或子进程进行数据加载或模型执行[^1]。 ### 原因分析 - **多进程资源管理异常**:nnUNet 在进行数据增强、预处理或训练依赖多进程并行处理,若子进程未能正确关闭或释放资源,可能导致句柄无效的错误[^2]。 - **控制台资源冲突**:在 Windows 平台上,某些操作(如 `print` 或日志输出)可能涉及控制台句柄的访问,若程序试图访问已被释放或无效句柄,会触发该错误[^4]。 - **外部库调用问题**:如果 nnUNet 依赖的某些库(如 `subprocess` 或 `r2pipe`)在执行过程中未能正确管理进程句柄,也可能引发此错误[^2]。 ### 解决方法 - **避免使用 `print` 或日志输出干扰进程管理**:在某些情况下,`print` 语句可能在子进程中触发控制台句柄的访问,导致异常。尝试注释掉与输出相关的代码以排除干扰[^4]。 - **确保正确关闭子进程**:在多进程处理完成后,确保所有子进程都已正确终止。可以使用 `multiprocessing.Pool` 的 `close()` 和 `join()` 方法来管理进程生命周期,避免句柄泄漏或访问无效句柄[^1]。 ```python from multiprocessing import Pool with Pool() as pool: results = pool.map(some_function, data_list) ``` - **禁用控制台释放操作**:在将 Python 脚本编译为 `.exe` 文件,某些框架(如 PyQt)会调用 `FreeConsole()` 函数释放控制台资源。若该操作导致句柄无效,可尝试将其注释掉以避免异常。 ```python # FreeConsole() # 注释掉此行 Application.Run() ``` - **更新 nnUNet 及相关依赖库**:确保使用的 nnUNet 版本以及 Python 环境中的依赖库(如 `batchgenerators`, `torch` 等)为最新版本,以获得对 Windows 多进程处理的更好支持。 - **使用 `driver.quit()` 替代 `driver.close()`**:如果问题出现在与 Selenium 等自动化工具交互的上下文中,应使用 `quit()` 方法代替 `close()` 以确保所有相关资源被正确释放[^5]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值