gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:00:54 31 4
gpt4 key购买 nike

我正在尝试使用此函数在我的一个 c++ 程序中从 python 加载一个函数

char * pyFunction(void)
{
char *my_result = 0;
PyObject *module = 0;
PyObject *result = 0;
PyObject *module_dict = 0;
PyObject *func = 0;
PyObject *pArgs = 0;

module = PyImport_ImportModule("testPython");
if (module == 0)
{
PyErr_Print();
printf("Couldn't find python module");
}
module_dict = PyModule_GetDict(module);
func = PyDict_GetItemString(module_dict, "helloWorld");

result = PyEval_CallObject(func, NULL);
//my_result = PyString_AsString(result);
my_result = strdup(my_result);
return my_result;
}

我应该使用什么来代替 PyString_AsString?

最佳答案

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

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

if (PyUnicode_Check(result)) {
PyObject * temp_bytes = PyUnicode_AsEncodedString(result, "UTF-8", "strict"); // Owned reference
if (temp_bytes != NULL) {
my_result = PyBytes_AS_STRING(temp_bytes); // Borrowed pointer
my_result = strdup(my_result);
Py_DECREF(temp_bytes);
} else {
// TODO: Handle encoding error.
}
}

处理返回的bytes(Python 2 str),然后你可以得到直接字符串:

if (PyBytes_Check(result)) {
my_result = PyBytes_AS_STRING(result); // Borrowed pointer
my_result = strdup(my_result);
}

另外,如果你收到一个非字符串对象,你可以将它转换使用 PyObject_Repr() , PyObject_ASCII() , PyObject_Str() , 或 PyObject_Bytes() .

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

if (PyUnicode_Check(result)) {
// Convert string to bytes.
// strdup() bytes into my_result.
} else if (PyBytes_Check(result)) {
// strdup() bytes into my_result.
} else {
// Convert into your favorite string representation.
// Convert string to bytes if it is not already.
// strdup() bytes into my_result.
}

关于python - 在 3.3 中加载 python 模块时,我用什么代替 PyString_AsString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22487780/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com