2016-07-26 31 views
1

Mein C++ - Code führt einen Python-Interpreter zum Lesen einer externen Python-Datei, und ich versuche, die C-API beide Python 2 und Python 3 Zeichenfolgen akzeptieren.Extrahieren Sie eine Python-Str mit C-API, kompatibel mit Python 2 & 3

Wenn Python 2.7.11, verwende ich PyString_Check und PyString_AsString. Wenn Sie Python 3.5.2 verwenden, verwende ich PyUnicode_Check und PyUnicode_AsUTF8String.

Die frühere Technik ist in Python 3.x veraltet.

Ich erwartete, dass letzteres zu beiden Versionen kompatibel ist. PyUnicode_Check gibt jedoch false unter Python 2 für ein Argument vom Typ str zurück. Außerdem gibt PyUnicode_AsUTF8String einen Segmentierungsfehler in diesem Fall.

Was mache ich falsch?

Antwort

0

fand ich endlich einen Weg, um eine Zeichenfolge aus Python-Versionen 2.7 und 3.5 (mindestens) zu extrahieren

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); 
}