Импортировать функцию C ++ в программу Python

Я экспериментирую с функциями python прямо сейчас. Я нашел способ импортировать функции python в код c / c ++, но не наоборот.

У меня есть программа c ++, написанная и имеющая в ней определенную функцию. Я хотел бы «импортировать» скомпилированную программу на C ++ в свой скрипт python и вызвать функцию c ++.

Для простоты, скажем, функция c ++ проста:

int square(x) { return x*x; } 

и скомпилированная программа называется Cprog.

Я бы хотел, чтобы мой скрипт python был чем-то вроде:

 import Cprog print Cprog.square(4) 

Это возможно? Я искал интернет безрезультатно, и я надеюсь, что у одного из вас, гуру, есть умный способ обойти это …

5 Solutions collect form web for “Импортировать функцию C ++ в программу Python”

Вот небольшое рабочее завершение простого примера выше. Хотя поток старый, я думаю, что полезно иметь простой всеобъемлющий справочник для новичков, потому что раньше у меня были некоторые проблемы.

content.cpp content (extern «C» используется так, чтобы модуль ctypes мог обрабатывать функцию):

 extern "C" int square(int x) { return x*x; } 

Содержимое wrapper.py:

 import ctypes print ctypes.windll.library.square(4) # windows print ctypes.CDLL('library.so').square(4) # linux or when mingw used on windows 

Затем скомпилируйте файл function.cpp (например, используя mingw):

 g++ -shared -c -fPIC function.cpp -o function.o 

Затем создайте общую библиотеку объектов со следующей командой (примечание: не везде есть пробелы):

 g++ -shared -Wl,-soname,library.so -o library.so function.o 

Затем запустите программу wrapper.py, и программа должна работать.

Если вы создадите свою программу как общую библиотеку / DLL, вы можете использовать ctypes для ее вызова.

 import ctypes print ctypes.windll.cprog.square(4) # windows print ctypes.CDLL('cprog.so').square(4) # linux 

Вы хотите расширить python с помощью модуля C / C ++. Следующая документация на Python – хорошее место для начала чтения: http://docs.python.org/extending/extending.html

Вам нужно создать модуль python с этой функцией. Существует три основных способа:

  1. Использование Swig – это считывает ваш код c и создает из него модуль python.
  2. Ручная кодировка с использованием python c api.
  3. Использование Boost :: Python (часто самый простой способ).

В этом PDF-документе описаны 1 и 2. На этой странице вы узнаете, как использовать Boost :: Python.

Вы не можете (легко) использовать функцию, которая находится в программе ac / c ++ – она ​​должна быть в статической библиотеке (которую вы также можете связать с вашей программой c / c ++).

EDIT – Cython Также стоит упомянуть.

Существует много разных способов обернуть код C ++, который будет использоваться в Python. Большинство из них перечислены в вики Python здесь .

Я нашел довольно простой способ автоматизировать это, чтобы использовать py ++ для автоматического создания оболочек, а затем скомпилировать сгенерированные файлы. Но это более уместно для крупных проектов, где обертывание всего вручную просто не очень возможно и вызовет кошмар для поддержания.

  • Что может изменить мое управляющее слово с плавающей запятой за моей спиной?
  • Общая память между процессами python
  • Как создать экземпляр метода шаблона класса шаблона с помощью swig?
  • Метод Python для повышения функции
  • Почему сбой Python / C API на PyRun_SimpleFile?
  • Ошибка Boost.python в примере hello world
  • Py_initialize / Py_Finalize не работает дважды с numpy
  • Связывание статической библиотеки с Boost Python (разделяемая библиотека) - Ошибка импорта
  • Лучший способ создать класс «generic», наследующий внешние классы модулей
  • Запуск сценариев python в приложении iOS
  • Арифметика высокой точности в Python и / или C / C ++?
  • Python - лучший язык программирования в мире.