使用C API解压缩python str,与python 2& 3兼容

时间:2016-07-26 16:24:33

标签: string python-3.x python-2.x python-c-api python-unicode

我的c ++代码运行python解释器来读取外部python文件,我试图使C API同时接受python 2和python 3字符串。

如果是python 2.7.11,我使用PyString_CheckPyString_AsString

如果是python 3.5.2,我使用PyUnicode_CheckPyUnicode_AsUTF8String

前一种技术在python 3.x中已弃用。

我期待后者与两个版本兼容。但是,对于类型为PyUnicode_Check的参数,false在python 2下返回str。此外,PyUnicode_AsUTF8String在这种情况下会出现分段错误。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我终于找到了一种从python版本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);
}