Snow Leopard, Homebrew python 2.7, virtualenv, libjpeg и PIL = ошибка импорта - PullRequest
2 голосов
/ 13 марта 2011

Существует множество вариантов этого вопроса в 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

Обратите внимание, что в Activity Monitor это отображается как 64-битный процесс.

Сначала я попытался установить libjpeg с помощью Homebrew. Позже я удалил его и устанавливал в / usr / local, скачав исходный код, например:

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

Ответы [ 3 ]

5 голосов
/ 13 марта 2011

byp Ваш виртуоз?Я просто сделал то же самое, хотя с системой 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 был создан для i386, ppc и x86_64 (потому что именно так компилировался Python от Apple), 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.Это несколько раздражает, но вы не получите лучшего сообщения об ошибке!

1 голос
/ 29 июня 2011

Я пытался решить эту проблему часами, единственный способ - использовать этот пакет:

http://ethan.tira -thompson.org / Mac_OS_X_Ports.html

для установки libjpeg, тогда PIL будет устанавливаться и работать должным образом из pip, и я думаю, что и другие источники.

0 голосов
/ 26 октября 2013
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
...