diff --git a/include/pybind11/common.h b/include/pybind11/common.h index d26c84f81..bebcd0725 100644 --- a/include/pybind11/common.h +++ b/include/pybind11/common.h @@ -67,12 +67,24 @@ #endif #if PY_MAJOR_VERSION >= 3 -#define PYBIND11_PLUGIN(name) \ +#define PYBIND11_PLUGIN_IMPL(name) \ extern "C" PYBIND11_EXPORT PyObject *PyInit_##name() #else -#define PYBIND11_PLUGIN(name) \ +#define PYBIND11_PLUGIN_IMPL(name) \ extern "C" PYBIND11_EXPORT PyObject *init##name() #endif +#define PYBIND11_PLUGIN(name) \ + static PyObject *pybind11_init(); \ + PYBIND11_PLUGIN_IMPL(name) { \ + try { \ + return pybind11_init(); \ + } catch (const std::exception &e) { \ + PyErr_SetString(PyExc_ImportError, e.what()); \ + return nullptr; \ + } \ + } \ + PyObject *pybind11_init() + NAMESPACE_BEGIN(pybind11) diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index eb0bf206a..c159b11a4 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -471,7 +471,10 @@ public: } static module import(const char *name) { - return module(PyImport_ImportModule(name), false); + PyObject *obj = PyImport_ImportModule(name); + if (!obj) + throw std::runtime_error("Module \"" + std::string(name) + "\" not found!"); + return module(obj, false); } };