使用boost.python从UTF-8编码的char *返回python unicode实例

时间:2011-02-21 10:37:37

标签: c++ python boost boost-python

我正在尝试做一些应该非常简单的事情,但是我没有太多运气来弄清楚现有文档中的内容。

对于python 2项目,我试图将一个列表gettext-translated字符串作为unicode实例返回给python。 gettext()的返回值是一个UTF-8编码的char *,使用PyUnicode_FromString转换为python unicode instrance应该非常简单。我有一种感觉,这是微不足道的,但我似乎无法弄清楚如何。

根据Ignacio Vazquez-Abrams和Thomas K的评论,我确实得到了一个字符串的工作;对于这种情况,您可以绕过所有boost.python基础结构。这是一个例子:

        PyObject* PyMyFunc() {
            const char* txt =  BaseClass::MyFunc();
            return PyUnicode_FromString(txt); 
    }       

暴露在通常的def语句中:

class_<MyCclass>("MyClass")
    .def("MyFunc", &MyClass::PyMyFunc);

不幸的是,当您想要返回unicode实例列表时,这不起作用。这是我天真的实施:

boost::python::list PyMyFunc() {
    std::vector<std::string> raw_strings = BaseClass::MyFunc();
    std::vector<std::string>::const_iterator i;
    boost::python::list result;

    for (i=raw_strings.begin(); i!=raw_strings.end(); i++)
        result.append(PyUnicode_FromString(i->c_str()));
    return result;
}

但是这不会编译:boost :: python :: list似乎处理PyObject值。

1 个答案:

答案 0 :(得分:2)

在C ++ - SIG邮件列表的帮助下,我现在正在使用它。需要两个额外的步骤:

  1. 使用boost :: python :: handle&lt;&gt;围绕PyObject *创建一个C ++包装器,负责引用处理
  2. 使用boost :: python :: object在句柄周围创建一个C ++包装器,允许使用PyObject *实例作为(合理的)普通C ++类实例,因此boost :: python :: list可以处理。
  3. 有了这些知识,工作代码如下所示:

    boost::python::list PyMyFunc() {
        std::vector<std::string> raw_strings = BaseClass::MyFunc();
        std::vector<std::string>::const_iterator i;
        boost::python::list result;
    
        for (i=raw_strings.begin(); i!=raw_strings.end(); i++)
            result.append(
                 boost::python::object(
                   boost::python::handle<>(
                     PyUnicode_FromString(i->c_str()))));
        return result;
    }