我不想继续使用PyUnicode_DecodeUTF8和PyUnicode_AsUTF8将每个Python字符串对象从PyObject*
转换为std::string
或char*
,因为这是一项昂贵的操作
在最后一个问题How to extend/reuse Python C Extensions/API implementation?上,我设法使用Python open
函数直接给了我一个PyObject*
字符串。完成此操作后,将字符串发送回Python程序非常简单,因为我只能将其PyObject*
指针传递回来,而不是像PyUnicode_DecodeUTF8
或{一样进行完整的逐字符复制{1}}做。
在CPython API的PyUnicode_AsUTF8
实现中,我可以找到函数like this:
regex
似乎没有使用static void* getstring(PyObject* string, Py_ssize_t* p_length,
int* p_isbytes, int* p_charsize,
Py_buffer *view)
{
/* given a python object, return a data pointer, a length (in
characters), and a character size. return NULL if the object
is not a string (or not compatible) */
/* Unicode objects do not support the buffer API. So, get the data directly. */
if (PyUnicode_Check(string)) {
if (PyUnicode_READY(string) == -1)
return NULL;
*p_length = PyUnicode_GET_LENGTH(string);
*p_charsize = PyUnicode_KIND(string);
*p_isbytes = 0;
return PyUnicode_DATA(string);
}
/* get pointer to byte string buffer */
if (PyObject_GetBuffer(string, view, PyBUF_SIMPLE) != 0) {
PyErr_SetString(PyExc_TypeError, "expected string or bytes-like object");
return NULL;
}
*p_length = view->len;
*p_charsize = 1;
*p_isbytes = 1;
if (view->buf == NULL) {
PyErr_SetString(PyExc_ValueError, "Buffer is NULL");
PyBuffer_Release(view);
view->buf = NULL;
return NULL;
}
return view->buf;
}
或PyUnicode_DecodeUTF8
来处理来自Python解释器的PyUnicode_AsUTF8
。
如何将基本的字符串操作与PyObject*
字符串一起使用而无需转换为PyObject*
或std::string
?
我将以下示例称为基本操作:(仅作为示例,我正在使用Py_BuildValue从字符串中将char*
生成为PyObject*
或char*
)
std::string