在3.3中加载python模块时,我使用什么来代替PyString_AsString

我试图用这个函数

从Python中的一个C++程序中加载函数

char*pyFunction(void)
{
char*my_result=0;
PyObject*module=0;
PyObject*result=0;
PyObject*模块_dict=0;
PyObject*func=0;
PyObject*pArgs=0;
module=PyImport\u ImportModule(“testPython”);
如果(模块==0)
{
PyErr_Print();
printf(“找不到python模块”);
}
module_dict=PyModule_GetDict(模块);
func=PyDict_GetItemString(模块_dict,“helloWorld”);
结果=PyEval_CallObject(func,NULL);
//my_result=PyString_AsString(结果);
my_result=strdup(my_result);
返回我的结果;
}

我应该用什么来代替PyString

根据helloWorld()函数返回的类型,它
可能会有所不同,所以最好检查一下

要处理返回的str(Python 2unicode),您需要
对它进行编码。编码将取决于您的用例,但我将
使用UTF-8:

if(PyUnicode\u检查(结果)){
PyObject*temp_bytes=PyUnicode_asencodeString(结果,“UTF-8”,“strict”);//拥有的引用
如果(临时字节数!=NULL){
my_result=PyBytes_AS_STRING(temp_bytes);//借用的指针
my_result=strdup(my_result);
Py_DECREF(临时字节);
}否则{
//TODO:处理编码错误。
}
}

要处理返回的字节(Python2str),可以获得
直接字符串:

if(PyBytes\u检查(结果)){
my_result=PyBytes_AS_STRING(result);//借用的指针
my_result=strdup(my_result);
}

此外,如果接收到非字符串对象,则可以将其转换
使用PyObject_Repr()、PyObject_ASCII()、PyObject_Str()或PyObject_Bytes()

所以最后你可能会想要这样的东西:

if(PyUnicode\u检查(结果)){
//将字符串转换为字节。
//将strdup()字节输入我的\u结果。
}else if(PyBytes_检查(结果)){
//将strdup()字节输入我的\u结果。
}否则{
//转换为您最喜欢的字符串表示形式。
//如果尚未将字符串转换为字节,请将其转换为字节。
//将strdup()字节输入我的\u结果。
}

发表评论