查找PIL / PILLOW正在使用哪个libjpeg

3
我遇到了一个问题,同一张 lena.jpg 图片在两台不同的电脑上读取出来的校验和不同。更奇怪的是,当我在这两台机器上运行 md5sum lena.jpg 时,得到的 md5 值相同,说明这两个文件是相同的。此外,如果我加载 png 文件而不是 jpeg 文件,数字看起来似乎匹配。这使我相信 Pillow 在两台不同的机器上存在分歧,或者至少它们用于读取 jpeg 文件的库不同。有没有办法检查 Pillow 正在使用哪个版本的 libjpeg(最好从 Python 中)?这两台计算机都是 Ubuntu,尽管其中一台是 12.04,另一台是 14.04(我还在 Mac 上测试过,并得到与 14.04 相同的值)。
2个回答

8

首先,找到你的Python安装使用的PIL egg:

>>> import PIL
>>> PIL.__path__
['/usr/local/python/2.7.3/lib/python2.7/site-packages/PIL']

然后在该目录中找到_imaging.so,并使用ldd(Linux)或otool -L(OS X)来查找它链接的libjpeg版本:

Linux

$ ldd /usr/local/python/2.7.3/lib/python2.7/site-packages/PIL/_imaging.so
    linux-gate.so.1 =>  (0x00641000)
    libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x00f00000)
    libz.so.1 => /lib/libz.so.1 (0x006f4000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00fad000)
    libc.so.6 => /lib/libc.so.6 (0x0021b000)
    /lib/ld-linux.so.2 (0x0067e000)

Mac OS X

$ otool -L /Users/lukas/src/pillow-env/lib/python2.7/site-packages/PIL/_imaging.so
/Users/lukas/src/pillow-env/lib/python2.7/site-packages/PIL/_imaging.so:
    /usr/local/lib/libjpeg.8.dylib (compatibility version 13.0.0, current version 13.0.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /usr/local/lib/libtiff.5.dylib (compatibility version 8.0.0, current version 8.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

太好了,你不知道如何在Windows上(使用mingw)完成这个操作吗?我尝试了objdump -p _imaging.pyd | grep .dll,得到以下结果:DLL名称:KERNEL32.dll、DLL名称:USER32.dll、DLL名称:GDI32.dll、DLL名称:python27.dll、DLL名称:MSVCR90.dll,c6f24 150 __dllonexit,但这并没有提到jpeg。 - Erotemic
@Erotemic 不好意思,我不知道。 - Lukas Graf

1

试试这个:

ldd path/to/your/PIL/_*.so

如果您正在使用虚拟环境,请尝试在您的VIRTUALENV_HOME中找到PIL,通常位于该目录下。
~/.virtualenvs/$VIRTUAL_ENV/lib/python2.7/site-packages/PIL

如果您正在使用Ubuntu软件包,请使用dpkg查找pillow/PIL安装的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接