雪豹系统,Homebrew的Python 2.7,virtualenv,libjpeg与PIL = 导入错误
在StackOverflow和网上,有很多关于这个问题的讨论。我尝试了很多方法,但都没有成功。
这是我的情况。我正在使用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位。
我首先尝试用Homebrew安装libjpeg。后来我把它卸载了,改为通过下载源代码手动安装到/usr/local,像这样:
export CC="/usr/bin/gcc -arch x86_64"
./configure --enable-shared --enable-static
make
sudo make install
然后,在我的Django虚拟环境中,我重新安装了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
3 个回答
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
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的方式解释清楚。
我花了好几个小时试图解决这个问题,最后发现唯一的方法是使用这个软件包:
http://ethan.tira-thompson.org/Mac_OS_X_Ports.html
通过这个链接安装libjpeg,然后PIL就可以正常通过pip安装并使用了,我想其他来源也可以。
byp
是你的虚拟环境吗?我刚刚做了同样的事情,不过我是用系统自带的 Python 2.6,没遇到任何问题。如果你愿意,可以直接把 libjpeg
安装到虚拟环境里,这样就不需要去修改 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
是为 i386
、ppc
和 x86_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,加载时就会失败。我通过以 32 位方式运行 Python,能够引发类似你看到的情况:
(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 的架构是否兼容。不过,没能给出更好的错误信息确实让人很烦!