PyBind11 создает файл pyd без какого-либо определенного мной классаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 PyBind11 создает файл pyd без какого-либо определенного мной класса

Сообщение Anonymous »

Я работаю над оболочкой класса C++ с помощью Pybind11, чтобы сделать его доступным в Python. Мой проект включает в себя динамическую библиотеку, созданную с помощью Qt6, которая содержит класс с именем Package. Я пишу класс-оболочку PackageExt и использую Pybind11 для привязки этой оболочки к модулю Python. Ниже приведен код, с которым я работаю:
Заголовок оболочки C++ (packageext.h)

Код: Выделить всё

#ifndef PACKAGEEXT_H
#define PACKAGEEXT_H

#include "package.h" // from the dynamic library

class PackageExt {
public:
PackageExt(const std::string &id);
PackageExt(const ContainerCore::Package &pkg);
PackageExt(const PackageExt &other);
PackageExt& operator=(const PackageExt &other);
~PackageExt();
void setPackageID(const std::string &id);
std::string packageID() const;
ContainerCore::Package* getBasePackage();
private:
ContainerCore::Package *mPackage; // Defined in the dynamic library
};

#endif // PACKAGEEXT_H
Привязка Pybind11 (bindcontainer.cpp)

Код: Выделить всё

#include
#include 
#include "packageext.h"

namespace py = pybind11;

PYBIND11_MODULE(ContainerPy, m) {
m.doc() = "Pybind11 plugin for Container library";

py::class_(m, "Package")
.def(py::init(), py::arg("id"),
"Constructor that initializes a Package with the specified ID.")
.def("get_package_id", &PackageExt::packageID,
"Get the package ID as std::string.")
.def("set_package_id", &PackageExt::setPackageID, py::arg("id"),
"Set the package ID using std::string.");
}
Конфигурация CMake (CMakeLists.txt)

Код: Выделить всё

find_package(Python REQUIRED COMPONENTS Interpreter Development)
find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core Concurrent Xml Network Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Concurrent Xml Network Sql)
find_package(pybind11 REQUIRED CONFIG HINTS ${PYBIND11_HINTS_PATH})
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(BINDING_FILES
bindcontainer.cpp
containerext.cpp
packageext.cpp
containermapext.cpp
)
pybind11_add_module(${PYTHON_LIB_NAME} MODULE ${BINDING_FILES})
target_link_libraries(${PYTHON_LIB_NAME} PRIVATE Container) # Dynamic library
target_link_libraries(${PYTHON_LIB_NAME} PRIVATE Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Xml Qt6::Sql)
target_link_libraries(${PYTHON_LIB_NAME} PRIVATE Python::Python)
Проблема:
После сборки модуля я успешно получаю файл .pyd. Однако когда я импортирую модуль в Python и проверяю его, я вижу следующее:
python

Код: Выделить всё

import ContainerPy
print(dir(ContainerPy))
The output is:
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
Похоже, что класс Package и его методы не предоставляются должным образом. Что может быть причиной этой проблемы и как ее устранить или исправить?
Дополнительные сведения:
  • Я использую Qt6 с pybind11 для оболочки класса C++.
  • Динамическая библиотека компонуется правильно, ошибок сборки нет.
  • Моя среда настроена на использование CMake для сборки проекта.
  • Я проверил, что файл .pyd создается, но привязки классов, похоже, не видны в Python.
  • файл pyd ContainerPy/ContainerPy.cpython-313-x86_64-linux-gnu.so установлен в папке site-packages в моей среде Python. .
  • Я создаю его в Linux, но код также можно собрать и в Windows/Macos.
Что я пробовал:
  • Я гарантировал, что конфигурация CMake связана с необходимыми компонентами Qt6 и Python.
  • Я проверил, что все исходные файлы включены в список BINDING_FILES.
  • Я проверил, нет ли отсутствующих зависимостей, которые могли бы привести к тому, что привязки классов не отображаются.
  • br />
Вопросы:
  • Могут ли возникнуть проблемы с тем, как я устанавливаю настроить привязки Pybind11?
  • Есть ли что-то конкретное, что мне следует проверить в конфигурации CMake или способе связывания библиотеки?


Подробнее здесь: https://stackoverflow.com/questions/791 ... -i-defined
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»