?

Log in

No account? Create an account

Ср, 9 дек, 2009, 03:10
Установка и сборка PIL (Python Imaging Library)

Установка и сборка PIL (Python Imaging Library) для Windows (Windows 7 x64)

Конкретно мне она нужна, чтобы в Django скрипт "manage.py validate" не выдавал такое вот фу: "headshot": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ ."

Для успешного прохождения требуется так называемый Налог на Воздух 9 (т.е. Microsoft Visual Studio 2008 Pro или обученный компилировать под x64 Express). Рассказ будет долгим (настолько долгим, что пришлось засунуть его под кат).

Ключевые слова:
Установка, компиляция и сборка PIL, Zlib, libJPEG, libTIFF, FREETYPE под Windows x64



Вначале, нужно скачать PIL.
http://www.pythonware.com/products/pil/

Там есть собранная версия под Windows, но почему-то она говорит "ой-йой, у вас не обнаружено Python"! Даже если запускать от имени администртора. У меня стоит 64-битная версия Python, зарегистрированная в реестре, и всё равно ничего не работает.

Кроме того, абсолютно неизвестно как именно и с поддержкой чего она собрана.

В общем, будем собирать вручную, и исключительно на Microsoft Visual Studio (никакого Cygwin или MinGW!)
Поехали.

Сначала сам PIL

На том же сайте есть исходники.

Чтобы сберечь себе нервы, качайте версию 1.1.6 (а то вдруг возникнут какие-нибудь проблемы с LibTiff, а патч совместимости с LibTiff есть только для PIL 1.1.6).

Согласно документации, ставиться должно очень просто.

в директории с разархивированными исходниками:
python setup.py build_ext -i
python selftest.py
и если последняя команда прошла успешно, то запускаем установку:
python setup.py install

Но проблема в том, что сборка не проходит успешно.
Если попробовать его установить "как есть", получим вот такое страшное сообщение:

*** TKINTER support not available (Tcl/Tk 8.5 libraries needed)
*** JPEG support not available
*** ZLIB (PNG/ZIP) support not available
*** FREETYPE2 support not available

Что означает: а сейчас мы собрали вам PIL с поддержкой ничего (= без поддержки всего). Замечательная перспектива, способствует постижению Дзен.

Первый кандидат: Zlib

http://gnuwin32.sourceforge.net/packages/zlib.htm
(выбираем ссылку Sources-Zip)

Открываем консоль Visual Studio: Пуск -> Microsoft Visual Studio 2008 -> Visual Studio Tools -> Visual Studio x64 Win64 Command Promt (тридцатидвухбитным товарищам нужно запускать соответствующую. Впрочем, у них и из бинарников, наверное, всё отлично устанавливается, ничего не нужно собирать вручную).

В консоли переходим в папку с разархивированным Zlib.
Сакральная команда звучит так: "nmake /f win32/Makefile.msc"

Но вот так сразу она не сработает, и вылетит с ошибкой: Cannot open include file: 'unistd.h': No such file or directory
Ну еще бы под виндой был unistd.
Идем в файл zconf.h, в папочке Zlib'а и с корнем вырезаем единственную строчку, содержащую упоминание unistd:
# include [unistd.h] /* for SEEK_* and off_t */

(угловые скобочки я заменил на квадратные чтобы не сломать разметку блога)

Снова запускаем сакральную команду "nmake /f win32/Makefile.msc", и вау: на этот раз всё собралось нормально.

Следующий кандидат — libJPEG.

Качаем вот отсюда: http://www.ijg.org/files/jpegsr7.zip
Распаковываем, заходим внутрь этой директории, копируем файл jconfig.vc с новым именем jconfig.h,
открываем эту директорию в Visual Studio x64 Console и запускаем команду nmake /f makefile.vc
Этого должно быть достаточно: слава Богу, новая версия (7) вышла в июне этого года. Иначе бы мы имели проблемы со старым исходником, описанные мелким шрифтом.

Если вдруг захочется реанимировать оригинальный libJPEG 98-ого года выпуска, есть несколько вариантов.

Казалось бы, как и всё остальное, скачать можно по адресу:
http://gnuwin32.sourceforge.net/packages/jpeg.htm.
Потом по инструкции скопировать файл jconfig.vc с новым названием jconfig.h и запустить команду nmake /f makefile.vc

Но не тут-то было! Будет куча синтаксических ошибок с общим смыслом "в соответсвии с синтаксисом языка Си тут нужна скобочка" и ничерта не скомпилируется. Это всё потому, что тот исходник не изменялся с 1998 года, более десяти лет. Целая жизнь.

Я обратился в Храм Джедаев, и вот что Сила указала.

Качаем новый исходник libJPEG (с хаками 2003его года) вот здесь:
http://www.neologica.it/download/files/IJGWin32.zip
Открываем IJGWin32.sln, Visual Studio попросит сконвертировать в новый формат, отвечаем что да.
После конвертации обязательно настроить платформу: Build -> Configuration Manager
В поле Configuration выбираем Release.
В поле Platform на 64-битной винде нужно сказать new -> Platform = "x64", Copy settings from = "Win32".
После этого копируем IJGWin32.lib из папки release в корневую два раза, переименовывая в libjpeg.lib и jpeg.lib.
Это чтобы либа и исходники лежали в одной папке.
Но эта либа почему-то работала не до конца, выдавая кучу unresolved external symbols'ов когда компилировалась вместе с LibTIFF и PIL. Возможно это можно как-то исправить.

Если нужно совсем-совсем оригинальный исходник то вот стартовые точки:
http://wiki.secondlife.com/wiki/Compiling_the_viewer_libraries_(MSVS_2003)#JPEGlib
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/f1c0a712-4c83-4cd3-a460-e8669ccc2059
Упоминающиеся там ссылки кое-где сдохли, но их можно выудить с помощью archive.org
Честно говоря, я не прошел этот квест до конца.


Следующий кандидат — LibTiff.

Скачать который можно по адресу:
http://gnuwin32.sourceforge.net/packages/tiff.htm
(так же Sources-Zip, качаем и куда-нибудь распаковываем)

В консоли Visual Studio переходим в папочку с исходниками (\src\tiff\3.8.2\tiff-3.8.2-src внутри распакованного архива... там еще много всяких исходников кроме этих).

В nmake.opt смотрим закомментированные секции с JPEG и ZIP, убираем комментарии, вписываем туда правильные пути до библиотек. Пути должны быть без пробелов.

Потом запускаем "nmake /f makefile.vc" и наслаждаемся результатом. В результате сборка должна закончиться с ошибками, на тему "unresolved external symbol __imp_TIFFGetVersion" и так далее. Это нормально.



Для старых исходников libtiff и pil нужно качать патч. Не факт что он вам потребуется, но если PIL не захочет компилироваться с ошибками из libTIFF, то попробуйте наложить его.

Качаем патч для PIL по адресу: http://static.wiredfool.com/Imaging-1.1.6-group4.patch
Сделал его из официального патча для 1.1.4 некий товарищ Eric Soroos, за что ему большое спасибо. Все равно лень разбираться, что именно делает этот патч.

Потом копируем патч в папку с распакованным PIL (так, чтобы он лежал рядом с папкой, в которой непосредственно находятся исходники), и с помощью Cygwin или DiffUtils запускаем патч на выполнение:
patch -p0 < Imaging-1.1.6-group4.patch

Вот отсюда можно скачать diffutils:
http://gnuwin32.sourceforge.net/downlinks/diffutils.php
http://gnuwin32.sourceforge.net/packages/patch.htm
Чтобы команда patch была доступна из командной строки, нужно добавить в PATH
C:\Program Files (x86)\GnuWin32\bin



Freetype2

Удивительно, но для него есть нормальный sln-файл для сборки в Visual Studio.
Скачать можно вот здесь: http://freetype.sourceforge.net/download.html#stable

Нужно открыть файл builds\win32\vc2008\freetype.sln
Потом обязательно настроить платформу: Build -> Configuration Manager
В поле Configuration выбираем Release Multithreaded (если раньше специально нигде не выпиливали /MD из мэйкфайлов)
В поле Platform на 32-битной винде нужно сказать new -> Platform = "x64", Copy settings from = "Win32".

После чего идем в папочку objs\win32\vc2008 и копируем файл в папку \include с именем freetype.lib.


И, наконец,
снова PIL


Откываем файл setup.py и проверяем пути до библиотек. Покажу на примере своего:

FREETYPE_ROOT = "F:/Downloads/Development/Python/pillibs/freetype/ft239/freetype-2.3.9/include"
JPEG_ROOT = "F:/Downloads/Development/Python/pillibs/jpegsr7/jpeg-7"
TIFF_ROOT = "F:/Downloads/Development/Python/pillibs/tiff-3.8.2-1-src/src/tiff/3.8.2/tiff-3.8.2-src/libtiff"
ZLIB_ROOT = "F:/Downloads/Development/Python/pillibs/zlib-1.2.3-src/src/zlib/1.2.3/zlib-1.2.3"
TCL_ROOT = None

FREETYPE_ROOT указывает на ту директорию, где лежит папка Includes с заголовками Freetype и либа. Ему нужно, чтобы в этой папке лежало два файла: ft2build.h и freetype.lib)
JPEG_ROOT указывает непосредственно на директорию с lib-файлом, который должен называться либо jpeg.lib, либо libjpeg.lib. Там же должны лежать исходники libjpeg.
ZLIB_ROOT указывает на директорию с lib-файлом, который должен называться zlib.lib
TIFF_ROOT указывает на директорию с lib-файлом, который должен называться libtiff.lib

потом говорим

python setup.py build_ext -i

И получаем радостную табличку:

--------------------------------------------------------------------
PIL 1.1.6 BUILD SUMMARY
--------------------------------------------------------------------
version 1.1.6
platform win32 2.6.4 (r264:75708, Oct 26 2009, 07:36:50)
[MSC v.1500 64 bit (AMD64)]
--------------------------------------------------------------------
*** TKINTER support not available (Tcl/Tk 8.5 libraries needed)
--- JPEG support ok
--- ZLIB (PNG/ZIP) support ok
--- FREETYPE2 support ok
--------------------------------------------------------------------

Потом

python selftest.py

В этом месте должно быть сказано, что все тесты пройдены наотличненько

ну и потом

python setup.py install

и наслаждаемся работающей библиотекой!

Замечания:
1) Говорят, у кого-то возникли на x64 проблемы со временем. Заменяйте __time32_t на time_t и будет счастье.
2) Что у нас не работает: у libTIFF не работает PIXARLOG, у PIL не работает TCL/TK. Если они вдруг кому понадобятся, могу попробовать провести расследование и понять как это делается.
3) Я не проверил качество (и вообще возможность) работы libTIFF. Возможно он вообще никак не работает, только собирается ;) Проверить работоспособность — домашнее задание.

Пт, 3 май, 2013 16:02 (UTC)
(Anonymous)

Автору большое спасибо за пост.

Сб, 4 май, 2013 05:43 (UTC)
(Anonymous)

Автору большое спасибо за пост.

Вт, 7 май, 2013 19:12 (UTC)
(Anonymous)

Автору большое спасибо за пост.

Вс, 2 июл, 2017 06:25 (UTC)
(Anonymous): $500 per day

If you have a desire to learn how to earn from $ 500 per day and work only for yourself, then write to us at email: admin@makemoneyonline.universalxyzdom.xyz