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

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

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

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

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

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

Я хочу, чтобы мой python script был чем-то вроде:

import Cprog

print Cprog.square(4)

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

Ответы

Ответ 1

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

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, программа должна работать.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Этот pdf охватывает 1 и 2. Эта страница расскажет вам, как использовать Boost:: Python.

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

РЕДАКТИРОВАТЬ - Cython Также стоит упомянуть.

Ответ 5

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

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