_imaging C ошибка модуля в python PIL - PullRequest
7 голосов
/ 27 мая 2011

Я читал другие посты о печально известной ошибке модуля _imaging C при установке PIL на Mac OS X, и ни одно из решений, предоставленных где-либо, включая FAQ по PIL, не оказалось полезным.

У меня самая новаяверсии libjpeg и zlib, недавно установленные из исходного кода.Я отредактировал файлы Makefile в каждом из них, чтобы включить параметр -arch i386 в переменную LD_FLAGS для 32-разрядных сборок.PIL устанавливается без каких-либо проблем, а в отчете об установке, напечатанном на терминале, говорится, что поддержка JPEG, TIFF и PNG в порядке.После этого я пробую самопроверку:

new-host:Imaging-1.1.7 ely$ python selftest.py 
*** The _imaging C module is not installed

Это обычно наблюдается по разным причинам.Занимаясь глубже, здесь я пытаюсь импортировать _imaging непосредственно в python.

new-host:Imaging-1.1.7 ely$ python
ActivePython 2.7.1.4 (ActiveState Software Inc.) based on
Python 2.7.1 (r271:86832, Feb  7 2011, 11:33:10) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL
>>> import _imaging
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/_imaging.so, 2): Symbol not found: _jpeg_resync_to_restart
  Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/_imaging.so
  Expected in: dynamic lookup

Здесь снова, символ не найден: _jpeg_resync_to_restart 'печально известен и распространен, и многие люди предположили, что это связано с неправильным путемв libjpeg.Я проверял снова и снова, и у меня только libjpeg (а также zlib и т. Д.) Установлены в моем домашнем каталоге, все в отдельных папках, из исходного кода, и все это правильно помечено в файле setup.py.

Итак, PIL должен получать поддержку jpeg (и zlib и т. Д.) Из нужных мест.Все зависимости установлены.Я вижу _imaging.so в моем sys.path, но я все еще получаю эту ошибку _jpeg_resync_to_restart.

Есть ли идеи, которые не ссылаются на альтернативные сообщения?Я потратил ~ 7 часов, читая и пробуя возможные решения из сообщений на каждом форуме, который я могу найти.

Ответы [ 9 ]

8 голосов
/ 27 июля 2011

Поскольку вы пробовали это несколько раз, я рекомендую запустить несколько команд, чтобы сначала очистить старые элементы и начать с начала.

Я использовал jpeg v8c и Imaging 1.1.6 на Mac OS X, 10.6 и 10.7

получить V8C JPEG Перейдите в каталог jpeg.

sudo make clean
CC="gcc -arch i386" ./configure --enable-shared --enable-static
make
sudo make install

получить изображение я использую 1.1.6

распаковываем CD в ​​образ

sudo rm -rf build
vi setup.py
JPEG_ROOT = libinclude(“/usr/local/lib”)
sudo python setup.py install

И это так просто

Запустите ваш интерпретатор Python,

import PIL
import _imaging
import Image

если все хорошо, то все готово.

Вот полная статья в моем блоге Python 2.7, OSX Lion, PIL и Imaging

4 голосов
/ 03 октября 2012

Сегодня вечером я столкнулся с той же проблемой на моем Mac под управлением Mac OS X v10.7.5, Python v2.7.1 с PIL Imaging 1.1.7 и jpeg 8d.


Подводя итог - ключ к успеху в моем случае был:

export ARCHFLAGS="-arch x86_64"

Ничто из других ответов не решило проблему, постоянно получаю: The _imaging C module is not installed вызвано: Symbol not found: _jpeg_resync_to_restart.

Копая здесь и там, наконец, я нашел решение, по крайней мере, у меня работает:

  • убедитесь, что у вас нет очевидных библиотек libjpeg в системе: find / -iname "libjpe*" сообщит вам об этом. Я временно поменял места, где они существуют, чтобы их никто не мог найти (особенно в моем случае / sw взаимодействовал с PIL):

    mv opt opt-OFF  
    mv sw sw-OFF  
    

Эти места были созданы портами Mac и fink - имейте в виду, что PIL может не найти FREETYPE2 после этого перемещения - если вам это нужно, просто переименуйте части libjpeg в этих местах.

  • в каталоге src PIL Imaging отредактируйте файл setup.py, как описано выше, чтобы установить для JPEG_ROOT значение / usr / local, попробуйте запустить:

    rm -rf build ; python setup.py build 2> /tmp/err > /tmp/log
    

Зарегистрируйтесь в / tmp / log - вы должны не увидеть поддержку JPEG. Теперь вы можете перейти к следующему шагу.

  • перейдите в каталог jpeg-8d src и запустите:

    export ARCHFLAGS="-arch x86_64"  
    sudo make clean; CC="gcc -arch x86_64" ./configure --enable-shared --enable-static  
    sudo make install
    
  • вернитесь в PIL Imaging, выполните следующие команды:

    export ARCHFLAGS="-arch x86_64"  
    sudo rm -rf build ; python setup.py build 2> /tmp/err > /tmp/log
    

Зарегистрируйтесь в / tmp / log - теперь вы должны увидеть «Поддержка JPEG доступна», check / tmp / err - поиск «jpeg» - если вы видите что-то вроде этого: ld: warning: ignoring file /usr/local/lib/libjpeg.dylib, file was built for unsupported file format which is not the architecture being linked (i386) - тогда флаги арки (оба устанавливаемые ARCHFLAGS и -arch) не сработали - исследуйте этот случай, это важно. Если вы этого не видите, то вам повезло, и вы можете запустить установку:

export ARCHFLAGS="-arch x86_64"  
sudo rm -rf build ; sudo python setup.py install

Проверьте, работает ли ваш PIL:

python selftest.py

или

echo "import _imaging" | python && echo "Works"

Надеюсь, это поможет.

2 голосов
/ 29 октября 2012

Я перепробовал большинство из этих предложений (а также два других предложения в ссылочных блогах) на старой версии Mac 10.6.Никто из них не работал как есть, однако, читая за строкой, я смог решить мою проблему.Я добавил в PIL setup.py в find_include_file () прямо перед строкой возврата 1 «print os.path.join (directory, include)».Это позволило мне отследить, против чего строится libjpeg PIL.Затем я собирал PIL, находил libjpeg, на который он ссылался (различные копии в / sw, / opt /, / usr / local / lib, ...), и удалял этот libjpeg (как заголовочные, так и файлы lib).

Наконец, с чистой системой я собрал и установил tar-архив с исходным кодом libjpeg, который я скачал сам, а затем собрал и установил PIL из исходного кода.Это сработало.В качестве запасного варианта вы всегда можете отключить libjpeg, удалив описанные выше файлы, как описано выше, или всегда возвращая ноль из описанной выше функции в setup.py.

2 голосов
/ 27 мая 2011

Проблема в том, что модуль _imaging связан с libjpeg динамически , а не статически. Код libjpeg не включен в модуль _imaging напрямую. Это означает, что динамический компоновщик вашей платформы должен быть в состоянии найти libjpeg, чтобы загрузить и связать его. Мои знания MacOS здесь нечеткие, но, насколько я помню, его динамический компоновщик называется dyld, а его справочная страница может предоставить больше информации об имеющихся у вас опциях.

Как правило, динамический компоновщик платформы не будет искать в вашем домашнем каталоге библиотеки - вы можете указать это, например, установив переменную среды DYLD_LIBRARY_PATH или отредактировав общесистемную конфигурацию (если есть 1.) Установка этой переменной среды обычно должна выполняться до запуска Python, поэтому она может не подойти. Вы можете попытаться встроить путь поиска во время выполнения в модуль расширения _imaging, что обычно делается путем передачи -rpath компоновщику - но я не знаю, предлагает ли компоновщик MacOS такую ​​возможность. Наконец, вы можете просто создать libjpeg как static библиотеку вместо общей библиотеки, и использовать для этого ссылку на модуль _imaging. Это позволило бы избежать ситуации с общей библиотекой для libjpeg. Для libjpeg это возможно сделать с помощью скрипта configure с --enable-static --disable-shared.

1 голос
/ 21 января 2016

Я столкнулся со всеми ошибками, о которых вы упомянули Я сломался и просто использовал virtualenv и вместо этого установил подушку. это сработало:

sudo pip install virtualenv
virtualenv python_script && cd !$
. /activate/bin
pip install Pillow
1 голос
/ 14 марта 2013

У меня хорошо работает на Mountain Lion 10.8.2:

Шаг первый .Удаление всех пакетов JPEG.Для MacPorts:

sudo port -f uninstall jpeg или sudo port -f uninstall jpeg @version_here

Нам нужно удалить все jpeg версии!

Шаг второй ,Удалить PIL: pip uninstall PIL

Шаг третий .Установите пакет JPEG снова.Для MacPorts: sudo port install jpeg

Шаг четвертый .Установите PIL снова: pip install PIL

>>> import PIL
>>> import _imaging

Без ошибок!


Как удалить ВСЕ пакеты jpeg?

$ port installed | grep -i jpeg
jpeg @8c_0
jpeg @9a_0 (active)

$ sudo port -f uninstall jpeg @8c_0
$ sudo port -f uninstall jpeg @9a_0

Не волнуйтесь о зависимостях.Поскольку нам нужно снова установить пакет jpeg:

$ sudo port install jpeg
0 голосов
/ 25 марта 2013

Я пытался установить PIL (OS X 10.7.5, Python 2.7.3) около 5 часов. Я также был увяз с ошибкой «Символ не найден: _jpeg_resync_to_restart» и попробовал многие из предложенных решений безрезультатно, включая переустановку всех его зависимостей. Наконец, я обнаружил установку с двойным щелчком мыши Подушка .

Спасибо, Рудикс! Теперь "import PIL" и "import _imaging" работают!

p.s. Я установил libjpeg через , я специально не удалял эту установку, поэтому я не уверен, было ли это частью окончательного решения или нет.

0 голосов
/ 01 октября 2012
0 голосов
/ 25 апреля 2012

У меня была та же проблема с Python 2.7 и OSX Lion, и я в основном следовал процессу @ApPeL и переустанавливал libjpeg и PIL.Казалось, что libjpeg установлен правильно, и PIL, похоже, нашел его правильно, но запуск python -v, а затем import _imaging всегда выдавал эту ошибку:

ImportError: dlopen (/ Library / Frameworks / Python.framework / Версии / 2.7 / lib / python2.7 / site-packages / PIL / _imaging.so, 2): Символ не найден: _jpeg_resync_to_restart

После установки и переустановки libjpeg (версия 8d)и PIL (версия 1.1.7) двадцать раз с немного отличающимися параметрами, что было сделано для того, чтобы убедиться, что я удалил все файлы libjpeg в / usr / local / include (заголовки), а также файлы в/ пользователь / местные / Библиотека.

Мне не нужно было устанавливать PIL из источника, я использовал pip install pil

...