21 июля 2010 г.

Компилирование Python пакетов

Недавно обновил Python до версии 2.7. Это правильно, потому что эта ветка будет поддерживаться долго-долго, параллельно с веткой 3.x, плюс она имеет некоторые клёвые фичи ветки 3.x (бэкпорт).

Но тут возникла проблема. Не все пакеты имеют скомпилированные установщики для Windows под Python 2.7. А установить такие пакеты средствами Python, такими, как pip, easy_install или setup.py install, не выходит, т.к. таким пакетам нужно откомпилировать кое-какой C/C++ код. А компилятора у меня нет. Значит, надо установить и настроить! :)

Можно пойти тремя путями:

  • Установить MS Visual Studio. Если я правильно понял, это не очень удобный вариант;
  • Установить Cygwin. Он создаёт Linux окружение в Windows. Тоже не очень хороший вариант, т.к. он будет компилировать код, который будет работать в этом Linux-окружении. В отличие от MinGW. К тому же у меня не получилось его завести после n времени;
  • Установить MinGW. Этот проект позволяет компилировать код в родной для Windows формат. Получающимся файлам не нужно никакое Linux окружение. Этот вариант и будем использовать.

Установка MinGW очень простая - заходим на сайт, качаем установщик, отмечаем нужные компоненты - c++ компилятор, fortran компилятор, mingw make, он скачает их из интернета.

После установки нужно добавить папку MinGW\bin\ в переменную окружения PATH. После установки MinGW у нас есть необходимые инструменты для компилирования C/C++/Fortran кода.

Теперь нужно настроить distutils для работы с этими инструментами. Создаём файл Python27\Lib\distutils\distutils.cfg и вставляем туда такой текст:

[build]
compiler = mingw32

Готово! Проверяем на пакете numpy. Скачиваем исходники (.tar.gz), распаковываем, выполняем:

cd numpy-1.4.1
setup.py install

Всё должно пройти хорошо и мы должны получить скомпилированный и установленный пакет numpy.

Кроме установки, setup.py может выполнять много других команд. Например, такая команда создаст установщик для Windows:

setup.py bdist_wininst

Получится файл numpy-1.4.1.win32-py2.7.exe:

Альтернативный способ, без редактирования файла distutils.cfg - указать компилятор в параметрах командной строки:

setup.py install build -c mingw32

Но не все пакеты могут быть так легко установлены. Некоторым нужно разрешить зависимости. Например, matplotlib как минимум не компилируется без freetype и без его исходников. Но это уже другая история.

Ссылки: