我正在將Python嵌入到C++應用程序中。我想在主模塊中定義一個函數V
,它接收一個字符串並返回一個類A
的實例。當使用Boost.Python嵌入時,Python的__main__消失的原因
的問題是,A
需要一些在課堂上嵌入的Python實例可用的數據,在本例中通過爲_env
- 所以我想我可以使用高清(...)的方法來定義V
,使用lambda捕獲所需的數據。
但是,當我這樣做時,我最終得到AttributeError: 'NoneType' object has no attribute '__dict__'
當我嘗試獲取主模塊的字典。
沒有調用boost的def(...),我可以獲取並添加到主模塊。
有沒有什麼我做錯了,導致__main__
去失蹤,併產生一個無我試圖訪問它?有關如何實現這一目標的任何建議?
void B::processRequest(Ptr<protocol::Message> msg, const std::function<void(const std::string &)> &send) {
try {
//make my_module module available to python
PyImport_AppendInittab("my_module", &initmy_module);
//
Py_Initialize();
//get the main module
py::object main_module((py::handle<>(py::borrowed(PyImport_AddModule("__main__")))));
py::object main_namespace = main_module.attr("__dict__");
py::object my_moduleNamespace((py::handle<>(PyImport_ImportModule("my_module"))));
//add the module to the main namespace
main_namespace["my_module"] = my_moduleNamespace;
//add attribute to namespace
// main_namespace["V"] = py::ptr(this);
auto AFn([this](std::string label) { return ptr<A>(_env, label); });
typedef boost::mpl::vector<Ptr<A>, std::string> AFnSig;
const auto policies = py::default_call_policies();
py::def("V", boost::python::make_function(AFn, policies, AFnSig()));
py::handle<> ignored((PyRun_String((*msg->action).c_str(), Py_file_input, main_namespace.ptr(), main_namespace.ptr())));
} catch (py::error_already_set) {
PyErr_Print();
}
Py_Finalize();
}
我能想到的解決這個問題的唯一的事情就是讓B
調用定義operator(std::stirng)
但是,這並不工作,因爲我有需要_env
其他兩個功能,其中一個爲相同的簽名V
所以根據我所見,無法區分這些電話。
編輯: 改變標題,試圖使它更清楚我所指的。