Как связать синглтон с Python в pybind между библиотекамиPython

Программы на Python
Ответить
Anonymous
 Как связать синглтон с Python в pybind между библиотеками

Сообщение Anonymous »


У меня есть синглтон, определенный на C++, который я хочу предоставить Python. Кажется, что Python создает новый экземпляр Singleton независимо от того, как я его привязываю. Мой основной код находится в базовой библиотеке, с которой также связан модуль Python.

cmake_minimum_required (ВЕРСИЯ 3.12) проект (pybind-синглтон) cmake_policy (SET CMP0148 НОВЫЙ) установить (CMAKE_CXX_STANDARD 17) find_package (ТРЕБУЕТСЯ КОНФИГ pybind11) find_package (ТРЕБУЕТСЯ разработка интерпретатора КОМПОНЕНТОВ Python3) add_library(my_lib ОБЩИЙ источник/Singleton.cpp ) message(STATUS "Python включает каталоги: " ${PYTHON_INCLUDE_DIRS}) message(STATUS "pybind include dirs: " ${pybind11_INCLUDE_DIRS}) target_include_directories(my_lib PUBLIC включает ${PYTHON_INCLUDE_DIRS} ${pybind11_INCLUDE_DIRS}) target_link_libraries(my_lib PUBLIC Python3::Python) pybind11_add_module(my_module src/binding.cpp) target_link_libraries(my_module PUBLIC my_lib) add_executable(${CMAKE_PROJECT_NAME} src/main.cpp) target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC my_lib) класс Singleton { публика: статический синглтон &GetInstance() { статический экземпляр Singleton; вернуть экземпляр; } Синглтон (Синглтон const &) = удалить; void оператор = (Singleton const &) = удалить; std::строковый тест; недействительный Инициал(); недействительный PrintTest(); частный: Синглтон(){}; }; namespace py = pybind11; PYBIND11_MODULE(мой_модуль, м) { py::class_(m, "Синглтон") .def_static( "print_test", []() { Синглтон::GetInstance().PrintTest(); }, py::return_value_policy::reference) .def_static( "get_test_val", []() { Синглтон &singleton = Синглтон::GetInstance(); вернуть синглтон.тест; }, py::return_value_policy::reference) .def_static( "get_instance", &Singleton::GetInstance, py::return_value_policy::reference) .def_readwrite("тест", &Singleton::test); } из my_module import Singleton print('Доступ к синглтону...') test_val = Singleton.get_test_val() print('Тестовое значение:', test_val если test_val != '' иначе 'Нет') Распечатать('--') Синглтон.print_test() Распечатать('--') экземпляр = Singleton.get_instance() печать (экземпляр) печать(экземпляр.test) instance.test = 'Экземпляр Python' печать(экземпляр.test) экземпляр.print_test() % ./pybind-singleton Создание экземпляра Синглтона... /Users/jordan/dev/pybind-singleton/src/Singleton.cpp: 12 /Users/jordan/dev/pybind-singleton/src/Singleton.cpp: 12 экземпляр C++ ------------ Запуск init.py Доступ к Синглтону... Тестовое значение: Нет -- /Users/jordan/dev/pybind-singleton/src/Singleton.cpp: 12 -- Экземпляр Python /Users/jordan/dev/pybind-singleton/src/Singleton.cpp: 12 Экземпляр Python В этом репозитории я составил минимальный пример; часть кода опущена для удобства чтения: https://github.com/jordanlevy96/pybind-singleton
Ответить

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

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

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

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

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