这个错误表明在运行 DataFlow 时,PyMuPDF 依赖的 libtiff
库与 libjpeg
库存在版本冲突。具体问题是 libtiff.so.6
需要 jpeg12_write_raw_data
函数(属于 LIBJPEG_8.0 版本),但当前加载的 libjpeg.so.8
中未包含此符号。
符号版本冲突:
libtiff
需要旧版 libjpeg (8.0) 的特定符号 jpeg12_write_raw_data
依赖链问题:
常见触发场景:
conda activate dataflow
# 降级 libjpeg-turbo 到兼容版本
conda install -c conda-forge libjpeg-turbo=2.1.0
# 重新安装依赖
pip uninstall -y pymupdf
pip install --no-cache-dir pymupdf
# 创建新环境(避免残留冲突)
conda create -n dataflow_fixed python=3.10
conda activate dataflow_fixed
# 通过 conda 安装所有依赖(确保版本兼容)
conda install -c conda-forge open-dataflow libjpeg-turbo libtiff
conda activate dataflow
# 定位问题库
find $CONDA_PREFIX -name 'libjpeg*'
# 创建符号链接欺骗加载器(临时方案)
cd $CONDA_PREFIX/lib
ln -s libjpeg.so.9 libjpeg.so.8
# 设置加载路径
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
FROM continuumio/miniconda3:4.12.0
RUN conda create -n dataflow python=3.10 \
&& conda install -c conda-forge open-dataflow libjpeg-turbo=2.1.0
构建并运行:
docker build -t dataflow-fixed .
docker run -it dataflow-fixed /bin/bash -c "conda run -n dataflow python -c 'import fitz; print(fitz.__doc__)'"
# 检查符号是否存在
nm -D $CONDA_PREFIX/lib/libjpeg.so | grep jpeg12_write_raw_data
# 测试PyMuPDF加载
python -c "import fitz; doc = fitz.open(); print('Success!')"
如果上述方法无效,手动编译兼容版本:
conda activate dataflow
conda install -c conda-forge swig cmake ninja
# 下载源码
git clone --recursive https://github.com/pymupdf/PyMuPDF
cd PyMuPDF
# 指定旧版MuPDF
git submodule update --init --recursive
cd mupdf
git checkout 1.26.3 # 兼容版本
cd ..
# 编译安装
pip install -v .
保持环境纯净:
# 安装前清理
conda clean --all
pip cache purge
固定关键库版本:
conda install libjpeg-turbo=2.1.0 libtiff=4.5.0
使用环境变量:
# 强制使用conda库
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$CONDA_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
注意:此错误常见于 Linux 环境(CentOS/RHEL 7.x 尤其多发),建议优先考虑 Docker 方案实现环境隔离。