我的c ++代码运行python解释器来读取外部python文件,我试图使C API同时接受python 2和python 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 :(得分: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);
}