- Python, Модули, SWIG, Windows
- Способ первый: Visual C++
- Способ второй: distutils
- douglas / gist:1066406
- This comment has been minimized.
- vsmallerx commented Oct 4, 2016
- This comment has been minimized.
- MadcowD commented Oct 11, 2016
- This comment has been minimized.
- Lyken17 commented Oct 18, 2016
- This comment has been minimized.
- gourav1905 commented Nov 19, 2016
- This comment has been minimized.
- MadcowD commented Jul 9, 2017
- This comment has been minimized.
- mwalmsley commented Jan 27, 2018
- This comment has been minimized.
- ozkansafak commented Feb 9, 2018
- This comment has been minimized.
- igor-egorov commented Mar 19, 2018
- This comment has been minimized.
- asterite3 commented Oct 12, 2018
- This comment has been minimized.
- ChrisjanWust commented Apr 21, 2020
- swiglpk 5.0.3
- Navigation
- Project links
- Statistics
- Maintainers
- Classifiers
- Project description
- Installation
- Example
- Documentation
- Development
- Project details
- Project links
- Statistics
- Maintainers
- Classifiers
- Release history Release notifications | RSS feed
- Download files
Python, Модули, SWIG, Windows
Эта статья – описание моих экспериментов по сборке модулей для Python. Мне понадобился высокоуровневый интерфейс к библиотеке LibRaw, притом в первую очередь под Windows.
Последний раз модуль для питона на C++ я писал в 2004 году. Модуль к мертворожденной (к счастью не мной) библиотеке ( я тупо продавал свои умения за зарплату). Естественно, навыки не закрепились. Помню, что SWIG сильно облегчил мне работу, поскольку нужен был объектный интерфейс, а «ручками» его писать ломало. Память у меня профессиональная – то есть избирательная и короткая, поэтому пришлось прыгать сначала.
Это статья только про настройку SWIG для Python под Windows. Писать же модули на C/C++ с использованием SWIG гораздо проще, чем всё настроить (кстати, у меня такое впечатление, что это парадигма современного программирования).
Первым делом я полез в яндексогугл. Epic fail — все советы и воркарраунды устарели года на три. Следуя им, мне пришлось совершать абсолютно ненужные шаги по сборке питона из исходников. Лишних шагов в статье нет, хотя питон собирается без проблем. Но если будете собирать, то полезный совет: возьмите из «коробочной» поставки файл Include/pycohfig.h и тихо положите его в собранную версию — пригодится.
Хорошие новости. Для сборки модулей можно использовать Microsoft Visual C++ Express Edition 2008, поскольку Питон 2.6+ собирается им. До этого приходилось либо компилировать питон из исходников, либо откапывать покрытый мхом VC++ 7.0, а я то и 6.0. Ещё более хорошие новости — модули можно компилировать MinGW. Кстати? тестовый модуль я откомпилировал gcc «включенным» в Strawberry Perl (довольно цинично если вспомнить древние питоно-перловые войны). Просто потому что это первый gcc в Path.
Итак, нам нужно взять пример из SWIG и превратить его в модуль. Для этого есть два способа.
Но, сперва, нужно установить собранный под Windows SWIG (swigwin-2.0.4) и прописать его в PATH. Примеры использования поставляются с ним же.
Способ первый: Visual C++
Нам понадобиться установить переменные среды окружения.
Дальше можно схалтурить — взять один из готовых примеров, для которых уже созданы солюшен (.sln) и проект. И спокойно, на его базе, сделать свой модуль. Например, открыть SWIG\Examples\python\class\exmple.sln . Переименовать examples.i , examples.cxx и examples_wrap.cxx , соответственно, в mymodule.i , mymodule.cxx и mymodule_wrap.cxx .
Как показал только что поставленный опыт, всё прекрасно работает.
Для более въедливых товарищей печенькаинструкция на английском. Как всегда, малость устаревшая (или, возможно, слишком новая). Пользуясь ею дословно, мне не удалось добиться профита. Ниже инструкция на русском, сокращённая и проверенная:
- Создаём новый проект для создания Windows DLL
- Создаём файлы my_module.cxx (или .c) для наших классов/функций, my_module.i для описания интерфейса. И прописываем (но не создаем) my_module_wrap.cxx . Первые два файла, я, естественно, подрезал из тех же примеров, но можно взять их например с википедии)
- Выбираем в среде my_module.i , в свойствах (Custom build setup) устанавливаем:
— Command Line: swig.exe -c++ -python $(InputPath)
— Outputs: $(InputName)_wrap.cxx
(Для C проектов, не нужно указывать ключ -c++ в первом случае. И расширение .cxx (достаточно .c) во втором.)
В итоге, мы создадим файл my_module_wrap.c(xx) из интерфейсного файла my_module.i - Дальше нужно задать местожительство заголовков питона. В свойствах проекта выбираем Configuration Properties » /C++ и устанавливаем Additional include directories в $(PYTHON_INCLUDE) (Зря его что-ли задавали?)
- Дальше по плану свойства линкера (Linker):
— Input » Aditional Dependies: «$(PYTHON_LIB)»
— General » Output File: $(ProjectDir)\_$(ProjectName).pyd
В первом случае кавычки не помешают, а во втором обратите внимание на подчёркивание. Зачем оно — я расскажу ниже. - Можно собирать проект. Не забудьте переключиться в Release конфигурацию. Чтобы использовать Debug, придется собирать питон из исходников, а оно нам надо?
- Профит
Способ второй: distutils
Что не может не радовать, питон 2.7 уже заточен под то, чтобы собирать модули используя distutils (в предыдущих версиях требовалось 3 килограмма шаманства ). При этом, мы можем использовать как и вышеупомянутый (не к ночи) MVC 2008, так и свободный MinGW.
О маленьких граблях поджидающих нас на этом пути, я, поглаживая лоб, сейчас расскажу.
Опять же, бесчеловечные эксперименты будем ставить на примере из SWIG. Итак, в директории SWIG/examples/classes создаём файл setup.py
Грабель первый.
Подчеркивание. Если его не указать получим ошибку LINK : error LNK2001: unresolved external symbol initexample .
Откуда она растёт?
Python, при создании модуля «руками» ожидает, что в скомпилированном модуле (бинарной части) будет функция с имением init . Сделано чтобы модуль, написанный на C/C++ мог вкурить её при загрузке бинарного модуля (и сообщить питону, что всё ок). Враппер (SWIG) функцию честно создаёт.
Но SWIG создаёт два(!) файла для нашего модуля: .py — питоновская обертка, содержащая нативные вызовы функций будущего модуля и _ .pyd (обратите внимание на подчеркивание) — бинарная библиотека. Дело в том, что бинарную библиотеку можно загрузить «в питон» той же самой инструкцией import , что и нативную (подчёркивание «подразумевается»). Соответственно, имена нативной обертки и бинарной библиотеки должны различаться. Они и различаются — на подчеркивание.
SWIG ожидает от нас, что бинарная библиотека будет с подчеркиванием, поэтому создал функцию с именем init_ , про которую линкер ничего не знает. Вот и ошибка.
Грабель второй
Мне потребовалось некоторое время лазания по исходникам, чтобы понять как передавать опции командной строки в вызов командной строки swig. По умолчанию distutil ожидает, что мы работаем с C. Поэтому потребовалось указать параметр -c++ (параметр -threads добавлен «для понтов», но может кому окажется не бесполезным).
Сборка
Теперь, когда мы разобрались, собрать модуль можно двумя способами:
Собрать, использую MVC:
python setup.py build
Собрать, используя MinGW:
python setup.py build -cmingw32
Оба способа протестированы и работают. Даже странно.
Любые советы (как можно было сделать проще) приветствуются. Критика тоже (но желательно с указанием как именно надо было сделать). Надеюсь мне не придётся ещё раз переписывать статью более чем наполовину, что произошло после первого же комментария. После которого я копнул чуть глубже, чем было до того.
Источник
douglas / gist:1066406
This comment has been minimized.
Copy link Quote reply
vsmallerx commented Oct 4, 2016
This comment has been minimized.
Copy link Quote reply
MadcowD commented Oct 11, 2016
top kek thanks a lot
This comment has been minimized.
Copy link Quote reply
Lyken17 commented Oct 18, 2016
This comment has been minimized.
Copy link Quote reply
gourav1905 commented Nov 19, 2016
that downloads older version of swig
This comment has been minimized.
Copy link Quote reply
MadcowD commented Jul 9, 2017
This comment has been minimized.
Copy link Quote reply
mwalmsley commented Jan 27, 2018
This comment has been minimized.
Copy link Quote reply
ozkansafak commented Feb 9, 2018
This installs 3.0.8. It’s not the newest version
The newest version is 3.0.12 as of Feb 8, 2018
This comment has been minimized.
Copy link Quote reply
igor-egorov commented Mar 19, 2018
SWIG 3.0.12 can be installed using this manual
This comment has been minimized.
Copy link Quote reply
asterite3 commented Oct 12, 2018
that downloads older version of swig
This installs 3.0.8. It’s not the newest version
The newest version is 3.0.12 as of Feb 8, 2018
Still useful though
This comment has been minimized.
Copy link Quote reply
ChrisjanWust commented Apr 21, 2020
If you’re at all developing for python, avoid 3.0.8.
sudo apt-get install swig should install 3.0.12 newer Ubuntu versions, but on 16.04 it install 3.0.8. So you’ll have to resort to manually installing.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Источник
swiglpk 5.0.3
pip install swiglpk Copy PIP instructions
Released: Mar 12, 2021
swiglpk — Simple swig bindings for the GNU Linear Programming Kit
Navigation
Project links
Statistics
View statistics for this project via Libraries.io, or by using our public dataset on Google BigQuery
License: GNU General Public License v3 (GPLv3) (GPL v3)
Tags optimization, swig, glpk
Maintainers
Classifiers
- Development Status
- 5 — Production/Stable
- Intended Audience
- Science/Research
- License
- OSI Approved :: GNU General Public License v3 (GPLv3)
- Programming Language
- Python :: 2.7
- Python :: 3.4
- Topic
- Scientific/Engineering
- Software Development
Project description
Plain python bindings for the GNU Linear Programming Kit (GLPK)
swiglpk is not a high-level wrapper for GLPK (take a look at optlang if you are interested in a python-based mathematical programming language). It just provides plain vanilla swig bindings to the underlying C library. In constrast to other GLPK wrappers for python (e.g. PyGLPK, Python-GLPK, ctypes-glpk, ecyglpki etc.) it is fairly version agnostic: it will try to guess the location of the glpk.h header file (using which glpsol) and then compile the extension for your particular GLPK installation. Furthermore, swiglpk provides binary wheels for all major platforms, which are always up-to-date with the most recent GLPK version (swiglpk versions follow GLPK versioning in the major and minor version digits to emphasize that).
Please show us some love by staring this repo if you find swiglpk useful!
Installation
That’s it. swiglpk comes with binary wheels for Windows, Mac, and Linux. No installation of third-party dependencies necessary.
Example
Running the following (slightly adapted) example from the GLPK manual …
… will produce the following output (the example can also be found at examples/example.py):
Pretty ugly right? Consider using optlang for formulating and solving your optimization problems.
Documentation
You can find documentation on GLPK’s C API here
Development
You still want to install it from source? Then you’ll need to install the following dependencies first.
If you’re on OS X, swig and GLPK can easily be installed with homebrew.
If you’re using ubuntu linux, you can install swig and GLPK using apt-get .
If you’re on Windows, you are on your own (checkout the appveyor.yml config file for directions).
Then clone the repo and run the following.
Project details
Project links
Statistics
View statistics for this project via Libraries.io, or by using our public dataset on Google BigQuery
License: GNU General Public License v3 (GPLv3) (GPL v3)
Tags optimization, swig, glpk
Maintainers
Classifiers
- Development Status
- 5 — Production/Stable
- Intended Audience
- Science/Research
- License
- OSI Approved :: GNU General Public License v3 (GPLv3)
- Programming Language
- Python :: 2.7
- Python :: 3.4
- Topic
- Scientific/Engineering
- Software Development
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you’re not sure which to choose, learn more about installing packages.
Источник