Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Panic in embedding python code in c++ using pybind11 #1557

Closed
singhanubhav2000 opened this issue Oct 7, 2018 · 2 comments
Closed

Panic in embedding python code in c++ using pybind11 #1557

singhanubhav2000 opened this issue Oct 7, 2018 · 2 comments

Comments

@singhanubhav2000
Copy link

singhanubhav2000 commented Oct 7, 2018

I have a problem where the code is panicing when I am making python call from C++.
the python snippet is

import utils
import TplatPythonInterface


       class TplatPyModule:
            def __init__(self):
                pass

            def connect(self, tplatEndpointInfo):
                self.cls = utils.getClassByName(tplatEndpointInfo.plugin_path,
                                                tplatEndpointInfo.sub_plugin,
                                                tplatEndpointInfo.application)
                self.cls.connect(tplatEndpointInfo.endpoint_ip, tplatEndpointInfo.blob)

Here is binding code

#include "embed.h"
#include "stl_bind.h"
#include "tplat_py_wrapper.h"
#include "sma_interface.h"
namespace py = pybind11;

Here epInfo_(of type tplatEndpointInfo*) is defined in the base class smaTplatInterface,

class __attribute__((visibility("hidden"))) tplatPyWrapper :
public smaTplatInterface
{
        static pybind11::module module_;
        pybind11::object pyModule_;     <-- Pointer to python class
        static pybind11::object import(const std::string& module,
                                       const std::string& path,
                                       pybind11::object& globals);
public:
        static void initialize();
        static void finalize();
        tplatPyWrapper(tplatEndpointInfo* epInfo);
        ~tplatPyWrapper() {}

        SmaStatus connect();
};

py::module tplatPyWrapper::module_;

PYBIND11_MAKE_OPAQUE(tplatEndpointInfo);

PYBIND11_EMBEDDED_MODULE(TplatPythonInterface, m) {
        m.doc() = "Thirdplatform framework to python binding";
        py::class_<tplatEndpointInfo>(m, "TplatEndpointInfo", py::call_guard<tplatEndpointInfo>())
                .def(py::init<>(), py::return_value_policy::reference_internal)
                .def_readwrite("application", &tplatEndpointInfo::application_,
                               py::return_value_policy::reference_internal)
                .def_readwrite("endpoint_path", &tplatEndpointInfo::endpoint_path_,
                               py::return_value_policy::reference_internal)
                .def_readwrite("endpoint_ip", &tplatEndpointInfo::endpoint_ip_,
                               py::return_value_policy::reference_internal)
                .def_readwrite("sub_plugin", &tplatEndpointInfo::sub_plugin_,
                               py::return_value_policy::reference_internal)
                .def_readwrite("plugin_path", &tplatEndpointInfo::plugin_path_,
                               py::return_value_policy::reference_internal)
                .def_readwrite("blob", &tplatEndpointInfo::blob_,
                               py::return_value_policy::reference_internal)

The code is panicing at the time when we are trying to call the connect function as defined under.

static void initialize() {
        py::initialize_interpreter();
        py::object main     = py::module::import("__main__");
        py::object globals  = main.attr("__dict__");
        module_ = py::module::import("tplatPyModule");
}

tplatPyWrapper::tplatPyWrapper() {
                auto tplatPyModuleClass = module_.attr("TplatPyModule");
                pyModule_ = tplatPyModuleClass();
}

SmaStatus
tplatPyWrapper::connect()
{
        auto connect = pyModule_.attr("connect");
        connect(epInfo_);
        return SMA_OK;
}
initialize();
tplatPyWrapper* tp = new tplatPyWrapper(epInfo_);
tp->connect();
(gdb) bt
#0  0x00007ffff57845f7 in raise () from /lib64/libc.so.6
#1  0x00007ffff5785ce8 in abort () from /lib64/libc.so.6
#2  0x00007ffff60889d5 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6
#3  0x00007ffff6086946 in ?? () from /lib64/libstdc++.so.6
#4  0x00007ffff6086973 in std::terminate() () from /lib64/libstdc++.so.6
#5  0x00007ffff6086b93 in __cxa_throw () from /lib64/libstdc++.so.6
#6  0x00000000008f32a3 in pybind11::detail::simple_collector<(pybind11::return_value_policy)1>::call (this=0x7fffef9b4950, ptr=0xdbe690) at ../../../common/pybind11/cast.h:1943
#7  0x00000000008f00ee in pybind11::detail::object_api<pybind11::detail::accessor<pybind11::detail::accessor_policies::str_attr> >::operator()<(pybind11::return_value_policy)1, tplatEndpointInfo_*&> (this=0x7fffef9b4990) at ../../../common/pybind11/cast.h:2096
#8  0x00000000008d97c2 in tplatPyWrapper::connect (this=0x7fffcc01b6c0) at tplat_py_wrapper.cc:130

EDIT (@YannickJadoul): Wrapping code fragments with ``` to try achieving readability.

@singhanubhav2000
Copy link
Author

@wjakob , @vanossj , @jagerman Any idea on this panic? Please lemme know if you want me to add more info.

@YannickJadoul
Copy link
Collaborator

To be honest: I can't make sense of this. If this is still an issue, please post a clean, minimal and complete example that we can look at (potentially in a GitHub gist!). I'm lacking a lot of context, e.g. when this tp->connect(); is called.

I'm closing this. Reopen with the additional requested information if necessary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants