2

在StackOverflow和Web上有大量的这个问题的组合。我已经尝试了很多东西,没有为我工作。Snow Leopard,Homebrew python 2.7,virtualenv,libjpeg和PIL =导入错误

这是我的设置。我正在运行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 

注意,在活动监视器中,这被报告为一个64位的进程。

首先我试着用自制软件安装libjpeg。后来我卸载它,并已通过下载源,像这样将其安装到/ usr /地方:

export CC="/usr/bin/gcc -arch x86_64" 
./configure --enable-shared --enable-static 
make 
sudo make install 

然后,在我的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 

而且还在,它不起作用:

>>> 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 

回答

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 

虽然_imaging.so有内置的i386ppcx86_64(因为这是苹果的Python是如何被编译),libjpeg被编译为x86_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) 

由于_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 

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

+0

我还没有回来尝试这个呢...对不起,迄今为止没有upvote。 – gmhax 2011-05-03 23:16:00

+0

呃,一定不是非常紧急的:-) – 2011-05-04 03:13:22

0
mkvirtualenv project-env 
workon project-env 
brew install samueljohn/python/pillow 
pip install --upgrade --no-install Pillow 
sed -i '.bak' 's?JPEG_ROOT = None?JPEG_ROOT="\/usr\/local\/Cellar\/jpeg\/8c\/"?' $VIRTUAL_ENV/build/Pillow/setup.py 
sed -i '.bak' 's/TIFF_ROOT = None/TIFF_ROOT="\/usr\/local\/Cellar\/libtiff\/4.0.3\/"/' $VIRTUAL_ENV/build/Pillow/setup.py 
sed -i '.bak' 's/FREETYPE_ROOT = None/FREETYPE_ROOT="\/usr\/local\/Cellar\/freetype\/2.5.0.1\/"/' $VIRTUAL_ENV/build/Pillow/setup.py 
sed -i '.bak' 's/LCMS_ROOT = None/LCMS_ROOT="\/usr\/local\/Cellar\/little-cms\/1.19\/"/' $VIRTUAL_ENV/build/Pillow/setup.py 
cd $VIRTUAL_ENV/build/Pillow/ && python setup.py install