Импортировать функцию 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 matplotlib в проекте Qt C ++?
  • Как я могу реализовать класс C ++ в Python, который вызывается C ++?
  • вызов Python из C
  • C и Python - связь с сокетами
  • С нетерпением ждем будущего программирования, но смутно, с чего начать
  • Обратный вызов Python от SWIG PyObject_Call Segfault
  • Ошибка Py_Initialize - невозможно загрузить кодек файловой системы
  • Ускорение умножения матриц и векторов в Python, возможно, путем вызова C / C ++
  • Python - лучший язык программирования в мире.