Поскольку никто не ответил, я покажу все, что собрал сам за это время.Надеюсь, что это может быть полезно для некоторых.
Типы 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, просто чтобы облегчить его, пока проект находится в разработке.