Snow Leopard,Homebrew python 2.7,virtualenv,libjpeg和PIL =导入错误

gmh*_*hax 2 python macos libjpeg osx-snow-leopard python-imaging-library

这个问题在StackOverflow和Web上有很多排列.我尝试了很多东西,没有什么对我有用.

这是我的设置.我正在运行OS X 10.6.我用Homebrew安装Python 2.7.1:

$ python
Python 2.7.1 (r271:86832, Mar 12 2011, 16:21:44) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Run Code Online (Sandbox Code Playgroud)

注意,在Activity Monitor中,这被报告为64位进程.

首先,我尝试使用Homebrew安装libjpeg.后来我卸载它并通过下载源将其安装到/ usr/local,如下所示:

export CC="/usr/bin/gcc -arch x86_64"
./configure --enable-shared --enable-static
make
sudo make install
Run Code Online (Sandbox Code Playgroud)

然后,在我的Django virtualenv中,我重新安装PIL:

export CC="/usr/bin/gcc -arch x86_64"
pip uninstall PIL
pip install --no-install PIL
vi build/PIL/setup.py  # change JPEG_ROOT to libinclude("/usr/local")
pip install PIL
Run Code Online (Sandbox Code Playgroud)

而且,它不起作用:

>>> import _imaging
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/me/byp/lib/python2.7/site-packages/PIL/_imaging.so, 2): Symbol not found: _jpeg_resync_to_restart
  Referenced from: /Users/me/byp/lib/python2.7/site-packages/PIL/_imaging.so
  Expected in: dynamic lookup
Run Code Online (Sandbox Code Playgroud)

Nic*_*ley 5

byp是你的virtualenv?我只是做了同样的事情,虽然使用系统Python 2.6并没有问题.libjpeg如果需要,您可以直接安装到virtualenv,然后您就不必破解PIL构建脚本.这是我做的:

% mkvirtualenv foo
(foo)% cdvirtualenv
(foo)% lftpget http://www.ijg.org/files/jpegsrc.v8c.tar.gz
(foo)% tar zxf jpegsrc.v8c.tar.gz
(foo)% cd jpeg-8c
(foo)% CC="gcc -arch x86_64" ./configure --prefix=$VIRTUAL_ENV
(foo)% make install
(foo)% cd ..
(foo)% pip install PIL
(foo)% python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import _imaging
>>> _imaging
<module '_imaging' from '/Users/nicholas/LMI/foo/lib/python2.6/site-packages/PIL/_imaging.so'>
>>> ^D
Run Code Online (Sandbox Code Playgroud)

虽然_imaging.so已经构建了i386,ppc并且x86_64(因为这就是Apple的Python编译方式),libjpegx86_64只是因为我给gcc的标志而编译:

(foo)% file lib/libjpeg.8.dylib
lib/libjpeg.8.dylib: Mach-O 64-bit dynamically linked shared library x86_64
(foo)% file lib/python2.6/site-packages/PIL/_imaging.so
lib/python2.6/site-packages/PIL/_imaging.so: Mach-O universal binary with 3 architectures
lib/python2.6/site-packages/PIL/_imaging.so (for architecture i386):    Mach-O bundle i386
lib/python2.6/site-packages/PIL/_imaging.so (for architecture ppc7400): Mach-O bundle ppc
lib/python2.6/site-packages/PIL/_imaging.so (for architecture x86_64):  Mach-O 64-bit bundle x86_64
(foo)% otool -L lib/python2.6/site-packages/PIL/_imaging.so
lib/python2.6/site-packages/PIL/_imaging.so:
    /Users/nicholas/LMI/foo/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
Run Code Online (Sandbox Code Playgroud)

由于动态_imaging.so链接libjpeg,如果dylib不适用于预期的体系结构,则会在加载时失败.我能够通过运行Python作为32位来激发类似于你所看到的东西:

(foo)% arch -i386 python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import _imaging
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/nicholas/LMI/foo/lib/python2.6/site-packages/PIL/_imaging.so, 2): Symbol not found: _jpeg_resync_to_restart
  Referenced from: /Users/nicholas/LMI/foo/lib/python2.6/site-packages/PIL/_imaging.so
  Expected in: flat namespace
 in /Users/nicholas/LMI/foo/lib/python2.6/site-packages/PIL/_imaging.so
Run Code Online (Sandbox Code Playgroud)

所以我要检查Python,PIL和libjpeg的架构是否兼容.虽然你没有得到更好的错误信息,但这很烦人!