boost python的资源句柄

Resource handle of boost python

本文关键字:句柄 资源 python boost      更新时间:2023-10-16

使用boost::python从c++调用python代码。

int main()
{
namespace bp = boost::python;
Py_Initialize();
bp::object main_module = bp::import("__main__");
bp::import("ldap");
bp::import("ldif");
bp::object main_namespace = main_module.attr("__dict__");
bp::exec("import ldap,ldifn"
         "l = ldap.initialize('ldaps://RIO-PC')n",
         main_namespace);
//get the ldap object from the main_namespace
boost::python::object ldap = boost::python::extract<boost::python::object>(main_namespace["l"]);
//...do something...
}

现在我想获得一个新的ldap对象,我可以这样做吗?

bp::object main_module_2 = bp::import("__main__");
bp::import("ldap");
bp::import("ldif");
bp::object main_namespace_2 = main_module_2.attr("__dict__");
bp::exec("import ldap,ldifn"
         "l = ldap.initialize('ldaps://RIO-PC')n",
         main_namespace);
//get the ldap object from the main_namespace
boost::python::object ldap_2 = boost::python::extract<boost::python::object>(main_namespace_2["l"]);

如果这是不安全的,我该怎么办?如果这是安全的,我还有别的选择吗?

环境:Boost版本:1_55_0编译器:vc2008操作系统:win7 64bits

现在我想获得一个新的ldap对象,我可以这样做吗?

是的,你可以。ldap模块是OpenLDAP C API的包装器,因此,如果python模块的文档本身不够清楚,您可以随时查阅原始文档[1,2]。在这里,您将发现从open/init/initialize方法调用返回的LDAP结构是一个按连接描述符。


为了进一步增强您的信心,您可以验证在您的特定平台上该对象没有被重用。您可以检查返回的python对象标识符(id(obj))是否不同:

#include <boost/python.hpp>
#include <iostream>
int main() {
    namespace bp = boost::python;    
    Py_Initialize();
    bp::object main_module = bp::import("__main__");
    bp::import("ldap");
    bp::object main_namespace = main_module.attr("__dict__");
    bp::exec(
         "import ldapn"
         "a = ldap.initialize('ldaps://tls.example.com')n"
         "b = ldap.initialize('ldaps://tls.example.com')n",
         main_namespace);
    boost::python::object a = boost::python::extract<
        boost::python::object>(main_namespace["a"]);
    boost::python::object b = boost::python::extract<
        boost::python::object>(main_namespace["b"]);
    std::cout << "id(a) = " << reinterpret_cast<long>(a.ptr()) << std::endl;
    std::cout << "id(b) = " << reinterpret_cast<long>(b.ptr()) << std::endl;
}