运行RobustVideoMatting报pims循环导入AttributeError错误
问题说明
本地运行RobustVideoMatting项目视频转换脚本时触发AttributeError报错,完整报错信息:partially initialized module 'pims' has no attribute 'pyav_reader' (most likely due to a circular import)
无法定位具体循环导入代码位置,需要可落地的修复方案。
完整报错调用链路
- Jupyter单元格执行
from inference import convert_video,调用convert_video函数时传入模型、本地测试视频路径、并行处理帧数量等配置参数 - 项目内
inference.py第22行执行导入语句from inference_utils import VideoReader, VideoWriter, ImageSequenceReader, ImageSequenceWriter - 项目内
inference_utils.py第3行执行import pims语句导入pims依赖 - Python第三方包pims的
__init__.py入口执行from pims.api import *完成包初始化逻辑 - pims包
api.py第32-33行尝试导入pims.pyav_reader子模块后,执行pims.pyav_reader.available()做可用性判断时触发最终报错,提示pims为未完全初始化的模块,不存在pyav_reader属性,Python官方标注该类报错大概率由循环导入导致。
修复方案
- 排查同名文件冲突
先检查Jupyter启动工作目录、RobustVideoMatting项目根目录下是否存在命名为pims.py的自定义脚本、或者名为pims的自定义文件夹。Python导入模块时会优先读取当前工作目录下的同名文件,此类情况会直接导致pims包无法完成正常初始化,触发半初始化报错。找到冲突文件后直接重命名,删除目录下所有__pycache__缓存文件夹,重启Jupyter内核即可。 - 固定兼容版本依赖
该报错是pims高版本与pyav依赖适配时的已知初始化bug,直接卸载当前环境的pims、av包,安装验证过的兼容版本即可:
安装完成后重启Jupyter内核再运行脚本。pip uninstall -y pims av pip install pims==0.6.1 av==10.0.0 - 修正pims包导入逻辑
如果不想降级依赖版本,可以直接修改pims包的初始化代码:找到当前Python环境下pims安装路径中的api.py文件,定位到32-33行的原有代码:
替换为不依赖顶层pims对象引用的写法,绕开初始化阶段的引用问题:from pims import pyav_reader if pims.pyav_reader.available():
保存修改后重启内核即可生效。from pims import pyav_reader if pyav_reader.available(): - 清理Jupyter导入缓存
如果之前运行代码时已经触发过一次pims导入失败,Jupyter内核会残留半初始化的pims模块缓存,此时直接重启内核,将import pims语句放在所有项目代码导入语句的最前面执行,避免导入顺序异常触发初始化问题。
内容的提问来源于stack exchange,提问作者Ala BR
相关产品推荐
相关产品推荐

