Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从boost::python::object列表中获取单个元素,用于python例程 我有一个Python列表的C++升压Python对象(PyObjor上的Boost包装器), PyObject * pyList = func(...); boost::python::object listObj(handle<>(boost::python::borrowed(pyList)));_Python_C++_Boost_Boost Python - Fatal编程技术网

从boost::python::object列表中获取单个元素,用于python例程 我有一个Python列表的C++升压Python对象(PyObjor上的Boost包装器), PyObject * pyList = func(...); boost::python::object listObj(handle<>(boost::python::borrowed(pyList)));

从boost::python::object列表中获取单个元素,用于python例程 我有一个Python列表的C++升压Python对象(PyObjor上的Boost包装器), PyObject * pyList = func(...); boost::python::object listObj(handle<>(boost::python::borrowed(pyList)));,python,c++,boost,boost-python,Python,C++,Boost,Boost Python,但我只希望它打印我指定的元素之一。我会用python编写 print myList[0] 因为它只是一个python列表。但是当我尝试的时候 print(listObj[0]); 在C++中使用PosithPython得到 Error in Python: <type 'exceptions.TypeError'>: No to_python (by-value) converter found for C++ type: boost::python::api::proxy<

但我只希望它打印我指定的元素之一。我会用python编写

print myList[0]
因为它只是一个python列表。但是当我尝试的时候

print(listObj[0]);
在C++中使用PosithPython得到

Error in Python: <type 'exceptions.TypeError'>: No to_python (by-value) converter found for C++ type: boost::python::api::proxy<boost::python::api::item_policies>.
Python中的代码>错误:没有为C++类型找到的TyPython(按值)转换器:Booo::Python::API::代理。

我如何从Python列表对象中访问单个元素,并将其用于Python调用中,如上面的打印方法(或者任何其他的Python函数,它都是用字符串输入的),在C++中?< /P> < P> <强>编辑< /String > Tanner Sansbury回答是C++方法来解决这个问题,下面我介绍的方法只是一个工作,它允许您在Booost::Python命名空间中分配Python对象到y-MyNythyPython解释器命名空间。


明白了。受此启发,我们需要将boost::python::对象分配给python名称空间,即

    boost::python::object main_module = boost::python::import("__main__");
    boost::python::object main_namespace = main_module.attr("__dict__");
    main_module.attr("myList") = listObj;  
    boost::python::exec("print myList", main_namespace);  
希望这有帮助。

编辑 Tanner Sansbury回答是C++方法来解决这个问题,下面我介绍的方法只是一个工作,它允许您在Booost::Python命名空间中分配Python对象到y-MyNythyPython解释器命名空间。
明白了。受此启发,我们需要将boost::python::对象分配给python名称空间,即

    boost::python::object main_module = boost::python::import("__main__");
    boost::python::object main_namespace = main_module.attr("__dict__");
    main_module.attr("myList") = listObj;  
    boost::python::exec("print myList", main_namespace);  

希望这有帮助。

boost::python::object返回一个对象。虽然
代理
类具有到的隐式转换,但API中有许多区域需要显式转换

代理显式构造
boost::python::object
应该可以解决转换异常:

print(boost::python::object(listObjString[0]);

下面是一个完整的嵌入式Python示例,演示如何通过以下方式打印列表中的单个元素:

  • Python内置的
    print
    函数
  • Python/capi中的
    PyObject\u Print()
    函数
  • 通过
    \uuu str\uuu
    提取对象的字符串表示形式,并使用
    std::cout
#包括
#包括
#包括
///@brief Default标志使PyObject_打印使用对象的
///_u_str__方法。python.h文件仅定义
///报告。
#定义Py\u打印\u STR 0
int main()
{
Py_初始化();
名称空间python=boost::python;
尝试
{
//创建并填充Python列表。
//>>>list=[x代表范围内的x(100103)]
python::列表;
BOOST_FOREACH(intx,BOOST::irange(100103))
列表。追加(x);
//从Boost.Python的操作符[]返回的代理提供
//用户定义的到Boost.Python对象的转换。在大多数情况下,
//需要显式调用转换。
//使用内置的打印功能打印列表[0]。
///>>>getattr(\uuuuu内置\uuuuuu,'print')(列表[0])
python::对象打印=
python::import(“\uuuu main\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
打印(python::object(列表[0]);
//使用Python/CAPI打印列表[1]。
//>>>导入sys;sys.stdout.write(列表[1]。\uuu str\uuu())
PyObject_Print(python::object(list[1]).ptr(),stdout,Py_Print_STR);

std::coutboost::python::object
返回一个对象。虽然
proxy
类具有到的隐式转换,但API中有许多区域需要显式转换

代理显式构造
boost::python::object
应该可以解决转换异常:

print(boost::python::object(listObjString[0]);

下面是一个完整的嵌入式Python示例,演示如何通过以下方式打印列表中的单个元素:

  • Python内置的
    print
    函数
  • Python/capi中的
    PyObject\u Print()
    函数
  • 通过
    \uuu str\uuu
    提取对象的字符串表示形式,并使用
    std::cout
#包括
#包括
#包括
///@brief Default标志使PyObject_打印使用对象的
///方法。python.h文件仅定义
///报告。
#定义Py\u打印\u STR 0
int main()
{
Py_初始化();
名称空间python=boost::python;
尝试
{
//创建并填充Python列表。
//>>>list=[x代表范围内的x(100103)]
python::列表;
BOOST_FOREACH(intx,BOOST::irange(100103))
列表。追加(x);
//从Boost.Python的操作符[]返回的代理提供
//用户定义的到Boost.Python对象的转换。在大多数情况下,
//需要显式调用转换。
//使用内置的打印功能打印列表[0]。
///>>>getattr(\uuuuu内置\uuuuuu,'print')(列表[0])
python::对象打印=
python::import(“\uuuu main\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
打印(python::object(列表[0]);
//使用Python/CAPI打印列表[1]。
//>>>导入sys;sys.stdout.write(列表[1]。\uuu str\uuu())
PyObject_Print(python::object(list[1]).ptr(),stdout,Py_Print_STR);

std::cout这正是我想要做的。我下面的方法实现了类似的结果,但了解boost::python::object的操作符[]的功能是一个更好的解决方案,也是我最终想要知道的。这正是我想要做的。我下面的方法实现了类似的结果,但理解boost::python::object的操作符[]的功能是一个更好的解决方案,也是我最终想要知道的。
    boost::python::object main_module = boost::python::import("__main__");
    boost::python::object main_namespace = main_module.attr("__dict__");
    main_module.attr("myList") = listObj;  
    boost::python::exec("print myList", main_namespace);