Я работаю над оболочкой класса C++ с помощью Pybind11, чтобы сделать его доступным в Python. Мой проект включает в себя динамическую библиотеку, созданную с помощью Qt6, которая содержит класс с именем Package. Я пишу класс-оболочку PackageExt и использую Pybind11 для привязки этой оболочки к модулю Python. Ниже приведен код, с которым я работаю: Заголовок оболочки C++ (packageext.h)
#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.");
}
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 или способе связывания библиотеки?
Я работаю над оболочкой класса C++ с помощью Pybind11, чтобы сделать его доступным в Python. Мой проект включает в себя динамическую библиотеку, созданную с помощью Qt6, которая содержит класс с именем Package. Я пишу класс-оболочку PackageExt и использую Pybind11 для привязки этой оболочки к модулю Python. Ниже приведен код, с которым я работаю: [b]Заголовок оболочки C++ (packageext.h)[/b] [code]#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 };
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."); } [/code] [b]Конфигурация CMake (CMakeLists.txt)[/b] [code]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) [/code] [b]Проблема:[/b] После сборки модуля я успешно получаю файл .pyd. Однако когда я импортирую модуль в Python и проверяю его, я вижу следующее: [b]python[/b] [code]import ContainerPy print(dir(ContainerPy)) The output is: ['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] [/code] Похоже, что класс Package и его методы не предоставляются должным образом. Что может быть причиной этой проблемы и как ее устранить или исправить? [b]Дополнительные сведения:[/b] [list] [*]Я использую Qt6 с pybind11 для оболочки класса C++. [*]Динамическая библиотека компонуется правильно, ошибок сборки нет. [*]Моя среда настроена на использование CMake для сборки проекта. [*]Я проверил, что файл .pyd создается, но привязки классов, похоже, не видны в Python. [*]файл pyd ContainerPy/ContainerPy.cpython-313-x86_64-linux-gnu.so установлен в папке site-packages в моей среде Python. . [*]Я создаю его в Linux, но код также можно собрать и в Windows/Macos. [/list] [b]Что я пробовал:[/b] [list] [*]Я гарантировал, что конфигурация CMake связана с необходимыми компонентами Qt6 и Python. [*]Я проверил, что все исходные файлы включены в список BINDING_FILES. [*]Я проверил, нет ли отсутствующих зависимостей, которые могли бы привести к тому, что привязки классов не отображаются.[*] br />[/list] [b]Вопросы:[/b] [list] Могут ли возникнуть проблемы с тем, как я устанавливаю настроить привязки Pybind11? [*]Есть ли что-то конкретное, что мне следует проверить в конфигурации CMake или способе связывания библиотеки? [/list]