2016-07-26 6 views
1

В моем коде на C++ выполняется интерпретатор python для чтения внешнего файла python, и я пытаюсь сделать C API приемлемым как для строк python 2, так и для python 3.Извлечь python str с C API, совместимый с python 2 & 3

Если python 2.7.11, я использую PyString_Check и PyString_AsString.

Если python 3.5.2, я использую PyUnicode_Check и PyUnicode_AsUTF8String.

Прежняя техника устарела в python 3.x.

Я ожидал, что последний будет совместим с обеими версиями. Однако PyUnicode_Check возвращает false под python 2 для аргумента типа str. Кроме того, PyUnicode_AsUTF8String дает ошибку сегментации в этом случае.

Что я делаю неправильно?

ответ

0

я наконец-то нашел способ извлечь строку из питона версии 2.7 и 3.5 (по крайней мере)

PyObject *s; 
if(PyUnicode_Check(py_val)) { // python3 has unicode, but we convert to bytes 
    s = PyUnicode_AsUTF8String(py_val); 
} else if(PyBytes_Check(py_val)) { // python2 has bytes already 
    s = PyObject_Bytes(py_val); 
} else { 
    // Not a string => Error, warning ... 
} 

// If succesfully converted to bytes, then convert to C++ string 
std::string val(""); 
if(s) { 
    val = std::string(PyBytes_AsString(s)); 
    Py_XDECREF(s); 
}