Экспорт классов C ++ для Python - PullRequest
       18

Экспорт классов C ++ для Python

0 голосов
/ 25 сентября 2018

У меня есть программа, написанная на C ++ (в настоящее время как статическая библиотека) с очень абстрактным интерфейсом, который использует перегрузку операторов в моих классах и т. Д. Я хочу создать из нее общую библиотеку (DLL на Windows будет первым шагом(прежде чем пытаться использовать другие платформы), чтобы использовать его на других, более "дружественных" языкахЯ читал, что Python имеет некоторый уровень поддержки этого с его ctypes.

Я просто хочу знать, возможно ли использовать некоторые абстракции более высокого уровня из C ++ DLL в Python, чтобы выбрать правильный вариант, прежде чем ятратить время на попытки что-то сделать, это невозможно.Пользователь должен иметь возможность инициализировать классы, предоставляемые моей программой, и использовать их со всеми своими методами, включая перегруженные операторы (конечно, только те, которые доступны в python).Или Python предназначен только для поддержки некоторых простых вызовов функций и т. Д.?

Код C ++ (даже просто классы, доступные для пользователя) огромен, и я хотел бы избежать создания отдельных оболочек Python, так как все необходимые функцииуже сделано в C ++.

1 Ответ

0 голосов
/ 09 октября 2018

Поскольку никто не ответил, я покажу все, что собрал сам за это время.Надеюсь, что это может быть полезно для некоторых.

Типы Python предназначены для поддержки только функций языка Си.Поэтому нет прямого доступа к классам и другим объектам C ++ из Python с использованием ctypes.Однако есть несколько способов доступа к ним.

Утомительный метод

Создание объектов стиля C для классов C ++, а затем создание оболочек Python для них.

CОбъект стиля в основном будет указателем на объект C ++, размещаемый динамически.Он должен иметь дополнительные методы, такие как, например, условно названный ->Release(), для уничтожения объекта и освобождения выделенной памяти.Затем вам нужно будет вручную создать оболочки Python, которые будут напоминать исходный объект C ++, включая перегруженные операторы и т. Д. (Sidenote: единственный встреченный мной оператор, который может понадобиться в таких ситуациях и который не перегружается в Python, - это оператор присваивания.)

Это, вероятно, лучшее решение, когда вы хотите полностью контролировать происходящее и не возражаете против дублирования интерфейса в Python.

Быстрый метод

Boostпредоставляет библиотеку Boost :: Python для этого.Он позволяет вам экспортировать практически все, что вам нужно - классы, операторы, даже несколько перегруженных методов.

Единственная проблема заключается в том, что эта библиотека достаточно велика и является одной из библиотек Boost, не предназначенных только для заголовков, поэтомувам нужно выяснить, как создать его с вашим проектом, и это может быть непросто для людей, которые никогда не работали с Boost (как я).

Я не знаю, что именно делает эта библиотека, может бытьэто просто автоматизирует то же самое, что описано в предыдущем методе.Поэтому я не уверен, уменьшает ли он уровни дополнительных оболочек или просто выполняет всю сложную работу за вас, но он делает то, что мне нужно было сделать.

Более быстрый метод

К счастью, я наткнулся на альтернативу - pybind11.Это сравнительно небольшая библиотека, которая делает то же самое, что Boost :: Python и только для заголовков.Он имеет хорошую документацию и прост в использовании.Он называется pybind 11 , так как первоначально он предназначался для поддержки C ++ 11, но в настоящее время он поддерживает C ++ 14 и экспериментально C ++ 17, но я использовал его с проектом C ++ 17 и нашелпока проблем нет.

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

...