Python, SWIG, Visual C++

в 8:34, , рубрики: python, SWIG, windows, модули, метки: , , ,

Эта статья – описание моих экспериментов по сборке модулей для Python. Мне понадобился высокоуровневый интерфейс к библиотеке LibRaw, притом в первую очередь под Windows. Понятно, что под никсами все было бы гораздо проще (./configure && make,./configure && make…), но…

Последний раз модуль для питона на C++ я писал в 2004 году, модуль был к мертворожденной (к счастью не мной) библиотеке ( я тупо продавал свои умения за зарплату). Естественно, навыки не закрепились. Помню, что SWIG сильно облегчил мне работу, поскольку нужен был объектный интерфейс, а «ручками» его писать ломало. Память у меня профессиональная – то есть избирательная и короткая, поэтому пришлось прыгать сначала.

Это статья только про настройку SWIG для Python под Windows. Писать же модули с использованием SWIG гораздо проще, чем всё настроить (кстати, у меня такое впечатление, что это парадигма современного программирования).

Результат моих экспериментов под катом

Итак. Питон «из коробки» под винду собран винрарнейшим VC 7.0. Мне же нужен компилятор версией посовременнее, желательно бесплатный.Microsoft Visual C++ 2010 Express Edition сразу мимо. Собрать без шаманства питон на нём не получилось. А шаман я слабый – привык, что для настройки всего-всего есть специальные люди или коллеги. И даже разработал несколько высокопрофессиональных методов выканючивания помощи в настройках. Тут же собственный проект, канючить можно только у себя, что расстраивает.

Поэтому был использован Microsoft Visual C++ Edition 2008, которым LibRaw тоже собрался легко и непринужденно.

Питон из исходников собирается влёт. Для этого в каталоге C:PythonPCBuild (я не стал мудрить с путями) кем-то заботливо положен *.sln файл. Дальше всё просто. Согласно рекомендациям собрал две версии. Debug и Release (кстати Debug, хоть и собрался, но использовать его не получилось, т.е. модули для питона у меня собираются только в Release конфигурации).

Теперь два шаманства. С питона «из коробки» нагло сворован файлик pyconfig.h (я просто скопировал его с другой машины) и выложен в дирректорию PythonInclude. Дальше, из сборок выкладываются файлики файлики *.exe и *.dll в Python, *.lib файлы в новосозданную директорию PythonLibs, а *.pyd файлы согласно «официальной» структуре гордо отправились в PythonLib. C:Python естественным образом включается в PATH.

Уже собранный SWIG (swigwin) никаких страшных колдунств не потребовал. На всякий случай добавил его в в PATH.

Дальше, согласно инструкции переменные среды:

PYTHON_INCLUDE = С:PythonInclude
PYTHON_LIB = C:PythonLibspython27.lib

В примерах swigExamples берется пример, в котором есть *.dsp файл. В установленной по умолчанию
конфигурации Debug собираться модуль не желает (LINK: fatal error LNK1104: не удается открыть файл ''python27_d.lib'' – хотя такой файл есть). Устанавливаю в свойствах сборки Release – и ура. Всё собрано.

C:workswigExamplespythonclass>python runme.py
Creating some objects:
    Created circle <example.Circle; proxy of <Swig Object of type 'Circle *' at 0x022CA1B8> >
    Created square <example.Square; proxy of <Swig Object of type 'Square *' at 0x022CA278> >

A total of 2 shapes were created

Here is their current position:
    Circle = (20.000000, 30.000000)
    Square = (-10.000000, 5.000000)

Here are some properties of the shapes:
    <example.Circle; proxy of <Swig Object of type 'Circle *' at 0x022CA1B8> >
        area      =  314.159265359
        perimeter =  62.8318530718
    <example.Square; proxy of <Swig Object of type 'Square *' at 0x022CA278> >
        area      =  100.0
        perimeter =  40.0

Guess I'll clean up now
1 shapes remain
Goodbye

Это не сообщение об ошибках – пример так работает.

Вроде всё настроено. Можно ехать дальше.

Ещё раз кратко «как нарисовать сову»:
1. Скачать и распаковать исходники Python
2. Скачать Microsoft Visial Studio C++ 2008 Express Edition
3. Скачать SWIG
4. Собрать Python (Python/PCBuild/pcbuild.sln) в Release и Debug конфигурации
5. Выложить в Python/Include pyconfig.h, можно взять здесь
6. Скопировать из сборки Python/PCBuild в Python *.exe и *.dll файлы, *.pyd в Python/Lib, *.lib в Python/Libs
7. Прописать переменные окружения PYTHON_INCLUDE, PYTHON_LIB.
8. Добавить Python в PATH, туда же можно добавить и SWIG, но не обязательно если работать только из среды
9. Открыть существующий файл проекта в примерах Swig/examples или создать его согласно рекомендациям
10. Скомпилировать пример
11. Профит? ;)

Любые советы (как можно было сделать проще) приветствуются. Критика тоже (но желательно с указанием как именно надо было сделать). Поскольку всю эту возню мне предстоит повторить на рабочей машине (ну в смысле той, которая стоит на работе). Правда, предварительно попробую ещё такой путь.

Статья об питоновском интерфейсе к LibRaw и собственно он сам в исходниках воспоследуют, как только интерфейс напишется. Понятно, что установить его можно будет без вышеуказанных колдунств.

Автор: mclander


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js