Я пытаюсь сделать что-то, что должно быть очень простым, но мне не очень повезло, выясняя, как из существующей документации.
Для проекта Python 2 я пытаюсь вернуть строку, переведенную gettext-списком, в виде экземпляров Unicode для Python. Возвращаемое значение для gettext () - это кодированный в UTF-8 символ char *, который довольно просто преобразовать в экземпляр юникода python с использованием PyUnicode_FromString. У меня такое чувство, что это тривиально, но я не могу понять, как это сделать.
Основываясь на комментариях Игнасио Васкеса-Абрамса и Томаса К. Я получил эту работу для одной строки; в этом случае вы можете обойти всю инфраструктуру 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.