#include namespace py = pybind11; /* Simple test module/test class to check that the referenced internals data of external pybind11 * modules aren't preserved over a finalize/initialize. */ namespace { // Compare unsafe_reset_internals_for_single_interpreter in // test_subinterpreter.cpp. void unsafe_reset_local_internals() { // NOTE: This code is NOT SAFE unless the caller guarantees no other threads are alive // NOTE: This code is tied to the precise implementation of the internals holder py::detail::get_local_internals_pp_manager().unref(); py::detail::get_local_internals(); } } // namespace PYBIND11_MODULE(external_module, m, py::mod_gil_not_used(), py::multiple_interpreters::per_interpreter_gil()) { // At least one test ("Single Subinterpreter") wants to reset // internals. We have separate local internals because we are a // separate DSO, so ours need to be reset too! unsafe_reset_local_internals(); class A { public: explicit A(int value) : v{value} {}; int v; }; py::class_(m, "A").def(py::init()).def_readwrite("value", &A::v); m.def("internals_at", []() { return reinterpret_cast(&py::detail::get_internals()); }); }