String 使用与Python2&;兼容的C API提取python str;3. 我的C++代码运行Python解释器来读取外部Python文件,我试图让C API接受Python 2和Python 3字符串。

String 使用与Python2&;兼容的C API提取python str;3. 我的C++代码运行Python解释器来读取外部Python文件,我试图让C API接受Python 2和Python 3字符串。,string,python-3.x,python-2.x,python-c-api,python-unicode,String,Python 3.x,Python 2.x,Python C Api,Python Unicode,如果使用python 2.7.11,我将使用PyString\u Check和PyString\u AsString 如果使用python 3.5.2,我将使用PyUnicode\u Check和PyUnicode\u AsUTF8String Python3.x中不推荐使用前一种技术 我希望后者能够兼容两个版本。但是,PyUnicode\u Check在python2下为类型为str的参数返回false。此外,PyUnicode\u AsUTF8String在这种情况下给出了一个分段错误 我做

如果使用python 2.7.11,我将使用
PyString\u Check
PyString\u AsString

如果使用python 3.5.2,我将使用
PyUnicode\u Check
PyUnicode\u AsUTF8String

Python3.x中不推荐使用前一种技术

我希望后者能够兼容两个版本。但是,
PyUnicode\u Check
在python2下为类型为
str
的参数返回
false
。此外,
PyUnicode\u AsUTF8String
在这种情况下给出了一个分段错误


我做错了什么?

我终于找到了从python版本2.7和3.5(至少)中提取字符串的方法

PyObject*s;
如果(PyUnicode_-Check(py_-val)){//python3有unicode,但我们转换为字节
s=PyUnicode\u AsUTF8String(py\u val);
}否则如果(PyBytes\u Check(py\u val)){//python2已经有字节了
s=PyObject_字节(py_val);
}否则{
//不是字符串=>错误,警告。。。
}
//如果成功转换为字节,则转换为C++字符串
std::字符串val(“”);
若有(s){
val=std::string(PyBytes_AsString);
Py_XDECREF(s);
}