新建 conda 环境安装 mpv 后仍报 ModuleNotFoundError,如何解决?
安装 conda-forge::mpv 后,还需要在运行代码的 Python 环境中安装相应绑定。当前的 ModuleNotFoundError: No module named 'mpv' 表示解释器找不到 Python 模块。先解决模块导入问题,再检查底层 libmpv 能否加载。
为什么 conda 安装成功,Python 仍然无法导入?
conda 可以安装播放器、共享库、开发头文件和 Python 包。名为 mpv 的包不一定提供同名 Python 模块。conda-forge 的 mpv 包说明将其定义为媒体播放器。
这三个部分各有用途:
mpv播放器:用于直接播放媒体。libmpv:供其他程序调用的底层共享库。- Python 绑定:提供
import mpv和mpv.MPV()等接口。
share/doc/mpv 和 include/mpv 分别用于存放文档和头文件,其中没有 Python 代码是正常的。仅检查这两个目录,也不能确定整个环境是否包含 libmpv。
先确认 Python 和 pip 属于 pymedia 环境
在终端中执行:
conda activate pymedia
python -c "import sys; print(sys.executable); print(sys.prefix)"
python -m pip --version
根据问题中的环境位置,解释器路径应位于 /home/igor/anaconda3/envs/pymedia/ 下,pip 的路径也应属于该环境。
后续使用 python -m pip 安装时,pip 由当前 Python 调用,可以避免把绑定装到其他环境。如果通过 IDE 或 Jupyter 运行代码,还需要检查选用的解释器或内核。
在当前环境安装 Python 绑定
提供该接口的项目叫 python-mpv。其当前项目安装说明使用的 pip 安装命令是 pip install mpv。在已激活的环境中执行:
python -m pip install mpv
python -m pip show mpv
python -c "import mpv; print(mpv.__file__)"
这里的 python -m pip install mpv 安装的是 Python 绑定;之前的 conda create -n pymedia conda-forge::mpv 安装的是不同对象,尽管名称相同。
如果最后一条命令输出模块文件路径,说明导入成功。若仍提示 No module named 'mpv',继续检查安装命令是否成功完成,以及执行安装和导入时的 sys.executable 是否一致。
原日志中的 Python 版本为 3.14.3,但仅凭目前的错误无法判断是否存在版本兼容问题。只有安装过程或后续运行出现明确的兼容性报错时,才需要根据具体版本要求处理。
如果错误变成找不到 libmpv,继续检查共享库
Python 绑定通过 ctypes 调用 libmpv。其模块源码在 Linux 上通过 ctypes.util.find_library('mpv') 查找共享库,找不到时会抛出 OSError。
安装绑定后,如果出现 Cannot find libmpv,就需要检查共享库。可以先执行:
find "$CONDA_PREFIX/lib" -maxdepth 1 -name 'libmpv.so*' -print
python -c "from ctypes.util import find_library; print(find_library('mpv'))"
第一项检查环境的 lib 目录中有没有库文件,第二项检查当前 Python 的查找机制能否发现它。
如果文件存在,但 Python 查找不到,可以临时把该环境的库目录加入搜索路径后重试:
LD_LIBRARY_PATH="$CONDA_PREFIX/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" python -c "import mpv; print(mpv.__file__)"
这条命令只对本次进程设置环境变量。它是否有效,取决于库文件的位置、查找机制及依赖是否完整。若报错指向某个缺失的 .so,应进一步检查该共享库的依赖;若目录中没有 libmpv.so*,则需要检查已安装包的文件清单,以及对应构建是否提供共享库。
不要把 include/mpv 加入 PYTHONPATH:头文件目录无法提供 Python 模块,也无法替代共享库。
导入成功后再验证播放
准备一个实际存在的本地媒体文件,将示例路径替换后运行:
import mpv
player = mpv.MPV()
try:
player.play('/absolute/path/to/video.mp4')
player.wait_for_playback()
finally:
player.terminate()
导入成功、播放器初始化成功和媒体播放成功是不同的验证步骤。后续若出现音频设备、显示环境或文件读取错误,应根据新的报错继续处理。
ompl-feedstock 中关于 Python 绑定的回复只适用于对应项目,不能直接用来判断 mpv 的打包情况。应以实际安装的 Python 模块和 libmpv 加载结果为依据。
备注:内容仅供参考。
