Linux swig что это

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 .

Как показал только что поставленный опыт, всё прекрасно работает.

Для более въедливых товарищей печенькаинструкция на английском. Как всегда, малость устаревшая (или, возможно, слишком новая). Пользуясь ею дословно, мне не удалось добиться профита. Ниже инструкция на русском, сокращённая и проверенная:

  1. Создаём новый проект для создания Windows DLL
  2. Создаём файлы my_module.cxx (или .c) для наших классов/функций, my_module.i для описания интерфейса. И прописываем (но не создаем) my_module_wrap.cxx . Первые два файла, я, естественно, подрезал из тех же примеров, но можно взять их например с википедии)
  3. Выбираем в среде 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
  4. Дальше нужно задать местожительство заголовков питона. В свойствах проекта выбираем Configuration Properties » /C++ и устанавливаем Additional include directories в $(PYTHON_INCLUDE) (Зря его что-ли задавали?)
  5. Дальше по плану свойства линкера (Linker):
    Input » Aditional Dependies: «$(PYTHON_LIB)»
    General » Output File: $(ProjectDir)\_$(ProjectName).pyd
    В первом случае кавычки не помешают, а во втором обратите внимание на подчёркивание. Зачем оно — я расскажу ниже.
  6. Можно собирать проект. Не забудьте переключиться в Release конфигурацию. Чтобы использовать Debug, придется собирать питон из исходников, а оно нам надо?
  7. Профит

Способ второй: 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

Оба способа протестированы и работают. Даже странно.

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

Источник

Linux swig что это

SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. SWIG is used with different types of target languages including common scripting languages such as Javascript, Perl, PHP, Python, Tcl and Ruby. The list of supported languages also includes non-scripting languages such as C#, D, Go language, Java including Android, Lua, OCaml, Octave, Scilab and R. Also several interpreted and compiled Scheme implementations (Guile, MzScheme/Racket) are supported. SWIG is most commonly used to create high-level interpreted or compiled programming environments, user interfaces, and as a tool for testing and prototyping C/C++ software. SWIG is typically used to parse C/C++ interfaces and generate the ‘glue code’ required for the above target languages to call into the C/C++ code. SWIG can also export its parse tree in the form of XML. SWIG is free software and the code that SWIG generates is compatible with both commercial and non-commercial projects.

  • Download the latest version.
  • Documentation, papers, and presentations
  • Features.
  • Mailing Lists
  • Bug tracking
  • SwigWiki!

Recent News

SWIG-4.0.2 summary:

  • A few fixes around doxygen comment handling.
  • Ruby 2.7 support added.
  • Various minor improvements to C#, D, Java, OCaml, Octave, Python, R, Ruby.
  • Considerable performance improvement running SWIG on large interface files.
  • SWIG now cleans up on error by removing all generated files.
  • Add Python 3.8 support.
  • Python Sphinx compatibility added for Doxygen comments.
  • Some minor regressions introduced in 4.0.0 were fixed.
  • Fix some C++17 compatibility problems in Python and Ruby generated code.
  • Minor improvements/fixes for C#, Java, Javascript, Lua, MzScheme, Ocaml, Octave and Python.
  • Support for Doxygen documentation comments which are parsed and converted into JavaDoc or PyDoc comments.
  • STL wrappers improved for C#, Java and Ruby.
  • C++11 STL containers added for Java, Python and Ruby.
  • Improved support for parsing C++11 and C++14 code.
  • Various fixes for shared_ptr.
  • Various C preprocessor corner case fixes.
  • Corner case fixes for member function pointers.
  • Python module overhaul by simplifying the generated code and turning most optimizations on by default.
  • %template improvements wrt scoping to align with C++ explicit template instantiations.
  • Added support for a command-line options file (sometimes called a response file).
  • Numerous enhancements and fixes for all supported target languages.
  • SWIG now classifies the status of target languages into either ‘Experimental’ or ‘Supported’ to indicate the expected maturity level.
  • Support for CFFI, Allegrocl, Chicken, CLISP, S-EXP, UFFI, Pike, Modula3 has been removed.
  • Octave 4.4-5.1 support added.
  • PHP5 support removed, PHP7 is now the supported PHP version.
  • Minimum Python version required is now 2.7, 3.2-3.7 are the only other versions supported.
  • Added support for Javascript NodeJS versions 2-10.
  • OCaml support is much improved and updated, minimum OCaml version required is now 3.12.0.
  • Add support for Octave-4.2.
  • Enhance %extend to support template functions.
  • Language specific enhancements and fixes for C#, D, Guile, Java, PHP7.
Читайте также:  Windows server запуск dhcp

SWIG-3.0.11 summary:
— PHP 7 support added.
— C++11 alias templates and type aliasing support added.
— Minor fixes and enhancements for C# Go Guile Java Javascript Octave PHP Python R Ruby Scilab XML.

This release fixes a couple of important regressions in SWIG-3.0.9 for smart pointers and importing Python modules.

Summary of changes in SWIG-3.0.9

  • Add support for Python’s implicit namespace packages.
  • Fixes to support Go 1.6.
  • C++11 std::array support added for Java.
  • Improved C++ multiple inheritance support for Java/C# wrappers.
  • Various other minor fixes and improvements for C#, D, Go, Java, Javascript, Lua, Python, R, Ruby, Scilab.

SWIG-3.0.8 summary:
— pdf documentation enhancements.
— Various Python 3.5 issues fixed.
— std::array support added for Ruby and Python.
— shared_ptr support added for Ruby.
— Minor improvements for CFFI, Go, Java, Perl, Python, Ruby.

SWIG-3.0.7 release summary:
Add support for Octave-4.0.0.
Remove potential Android security exploit in generated Java classes.
* Minor new features and bug fixes.

SWIG-3.0.6 is mostly a stability release.

Release summary:
— Stability and regression fixes.
— Fixed parsing of C++ corner cases.
— Language improvements and bug fixes for C#, Go, Java, Lua, Python, R.

More news Feedback and questions concerning this site should be posted to the swig-devel mailing list.

Источник

Интеграция Python с другими языками программирования

Использование SWIG

SWIG ( Simplified Wrapper and Interface Generator , упрощенный упаковщик и генератор интерфейсов) — это программное средство, сильно упрощающее (во многих случаях — автоматизирующее) использование библиотек, написанных на C и C++, а также на других языках программирования, в том числе (не в последнюю очередь !) на Python . Нужно отметить, что SWIG обеспечивает достаточно полную поддержку практически всех возможностей C++, включая предобработку, классы, указатели, наследование и даже шаблоны C++. Последнее очень важно, если необходимо создать интерфейс к библиотеке шаблонов.

Пользоваться SWIG достаточно просто, если уметь применять компилятор и компоновщик (что в любом случае требуется при программировании на C/C++).

Простой пример использования SWIG

Предположим, что есть программа на C, реализующая некоторую функцию (пусть это будет вычисление частоты появления различных символов в строке):

Для того чтобы можно было воспользоваться этой функцией из Python, нужно написать интерфейсный файл (расширение .i) примерно следующего содержания:

Интерфейсные файлы содержат инструкции самого SWIG и фрагменты C/C++-кода, возможно, с макровключениями (в примере выше: $result , $1 ). Следует заметить, что для преобразования массива целых чисел в кортеж элементов типа long , необходимо освободить память из-под исходного массива, в котором подсчитывались частоты.

Теперь (подразумевая, что используется компилятор gcc ), создание модуля расширения может быть выполнено примерно так:

После этого в рабочем каталоге появляется файлы _freq.so и freq .py , которые вместе и дают доступ к требуемой функции:

Помимо этого, можно посмотреть на содержимое файла freq_wrap.c, который был порожден SWIG: в нем, среди прочих вспомогательных определений, нужных самому SWIG, можно увидеть что-то подобное проиллюстрированному выше примеру модуля md5 . Вот фрагмент этого файла с определением обертки для функции frequency() :

В качестве упражнения, предлагается сопоставить это определение с файлом freq .i и понять, что происходит внутри функции _wrap_frequency() . Подсказка: можно посмотреть еще раз комментарии к C-коду модуля md5 .

Стоит еще раз напомнить, что в отличие от Python, в языке C/C++ управление памятью должно происходить в явном виде. Именно поэтому добавлена функция free() при преобразовании типа. Если этого не сделать, возникнут утечки памяти. Эти утечки можно обнаружить, при многократном выполнении функции:

Если функция freq .frequency() имеет утечки памяти, выполняемый процесс очень быстро займет всю имеющуюся память.

Источник

Linux swig что это

Инструмент для разработки

SWIG (англ. Simplified Wrapper and Interface Generator ) — свободный инструмент для связывания (англ.) программ и библиотек написанных на C/C++ со скриптовыми языками, такими как Tcl, Perl, Python, Ruby, PHP или другими языками наподобие Java, C#, Scheme или OCaml. Основная цель — достигнуть связи с минимальными усилиями: в файлы заголовка программы добавляется небольшое количество указаний, по которым SWIG генерирует исходный код для склеивания C/C++ и нужного языка. В зависимости от языка, результат склеивания может быть представлен в трех формах:

  • исполняемый файл исходной программы со встроенным интерпретатором скриптового языка
  • разделяемая библиотека, к которой существующий интерпретатор может подключаться в виде расширения
  • разделяемая библиотека, которая может подключаться к другим программам, написанным на нужном языке (например, с помощью JNI для Java)
Читайте также:  Ворлд офис 2010 для windows

Существует две основные причины для встраивания скриптового языка в C/C++ программу:

  • С помощью скриптового языка вместо C/C++ программа может дорабатываться намного быстрее. Скриптовый движок можно даже сделать доступным пользователям, чтобы они могли автоматизировать свою работу через скрипты. Такой приём повсеместно используется в играх для написания сюжета и уровней.
  • Даже если конечный продукт не будет включать скриптовый движок, тем не менее практика написания тестовых скриптов может оказаться полезной.

Есть несколько причин для создания динамических библиотек, которые могут загружаться существующими интерпретаторами:

  • Предоставить доступ к C/C++ библиотеке при отсутствии аналогов в скриптовом языке
  • Изначальное создание программы полностью на скриптовом языке и переписывание критических участков кода после анализа производительности на C/C++

Сам SWIG написан на С и C++ и публично доступен с февраля 1996 года. Он распространяется на условиях, схожих с лицензией BSD, то есть его можно использовать, распространять дальше и модифицировать практически без ограничений, для коммерческих и некоммерческих целей.

Содержание

Простой пример использования SWIG (Python)

Предположим, что есть программа на C, реализующая некоторую функцию (печать текста):

Для того чтобы можно было воспользоваться этой функцией из Python, нужно написать интерфейсный файл (расширение .i) примерно следующего содержания:

создание модуля расширения может быть выполнено примерно так (на *NIX):

или так (на win* c cygwin):

Результат работы

Набираем в интерпретаторе Python следующий текст

Если заглянуть внутрь mytry.py то можно увидеть

Ссылки

Литература

  • Hans Petter Langtangen Python Scripting for Computational Science. — Springer, 2008. — 750 с. — ISBN 9783540739159

Для улучшения этой статьи желательно ? :
  • Проставив сноски, внести более точные указания на источники.

Wikimedia Foundation . 2010 .

Полезное

Смотреть что такое «SWIG» в других словарях:

Swig — Тип Инструмент для разработки Разработчики Сообщество ОС MS Windows Версия 1.3.33 23 ноября 2007 Лицензия Лицензия в стиле BSD Сайт … Википедия

SWIG — (Simplified Wrapper and Interface Generator) ist ein Programmierwerkzeug, das in C oder C++ geschriebene Module für andere Programmiersprachen, insbesondere Skriptsprachen, verfügbar macht. SWIG ist ein Open Source Projekt und… … Deutsch Wikipedia

Swig — Swig, v. t. [Cf. D. zwelgen to swallow, E. swallow, v.t.] 1. To drink in long draughts; to gulp; as, to swig cider. [Colloq.] [1913 Webster] 2. To suck. [Obs. or Archaic] [1913 Webster] The lambkins swig the teat. Creech. [1913 Webster] … The Collaborative International Dictionary of English

swig — [swıg] v past tense and past participle swigged present participle swigging [T] informal to drink something in large mouthfuls, especially from a bottle = ↑gulp ▪ He sat swigging beer and smoking. >swig n ▪ She took a long swig of coke … Dictionary of contemporary English

Swig — Swig, v. t. [Cf. Prov. E. swig to leak out, AS. sw[=i]jian to be silent, sw[=i]can to evade, escape.] 1. To castrate, as a ram, by binding the testicles tightly with a string, so that they mortify and slough off. [Prov. Eng.] [1913 Webster] 2.… … The Collaborative International Dictionary of English

swig — [ swıg ] verb intransitive or transitive INFORMAL to drink something from a bottle, can, glass, etc. carelessly and in large amounts ╾ swig noun count … Usage of the words and phrases in modern English

swig — swig·gle; swig; swig·ger; … English syllables

Swig — Swig, n. 1. A long draught. [Colloq.] Marryat. [1913 Webster] 2. (Naut.) A tackle with ropes which are not parallel. [1913 Webster] 3. A beverage consisting of warm beer flavored with spices, lemon, etc. [Prov. Eng.] [1913 Webster] … The Collaborative International Dictionary of English

SWIG — (de l anglais Simplified Wrapper and Interface Generator) est un outil dont le code source est libre. Il permet de connecter des logiciels ou bibliothèques logicielles écrites en C/C++ avec des langages de scripts tels que : Tcl, Perl,… … Wikipédia en Français

swig — [swig] Informal vt., vi. swigged, swigging [< ?] to drink, esp. in great gulps or quantities n. an instance of swigging; deep draft, esp. of liquor swigger n … English World dictionary

Источник

Оцените статью