[英]Extracting char* from a str PyObject in Python 3
有沒有人嘗試從類型名為str
的 Python 3 PyObject*
中提取char*
? Python 3 中的普通字符串在 C API 中具有類型名稱str
。
對於 Python 2,可以使用 header stringobject.h
中的 PyString_Check PyString_Check()
和PyString_AsStringAndSize
。
對於 Python 3 這個 header 不存在,而是bytesobject
和unicodeobject.h
。 對於后者,使用 D,我把
private const(char)[] toChars(PyObject* value) {
import deimos.python.unicodeobject : PyUnicode_Check;
if (PyUnicode_Check!()(value)) {
Py_ssize_t size;
const char* s = PyUnicode_AsUTF8AndSize(value, &size);
return s[0 .. size];
}
...
}
// https://docs.python.org/3/c-api/unicode.html#c.PyUnicode_AsUTF8AndSize
const(char)* PyUnicode_AsUTF8AndSize(PyObject* unicode, Py_ssize_t* size);
但這與通過str(...)
創建的str
類型的標准 Python 3 字符串(文字)傳遞的value
不匹配。 此外,我想不出一種方法來在 Python 3 中構造與PyUnicode_Check
中的 PyUnicode_Check 匹配的“unicode 字符串”。 我完全糊塗了。 我可以嘗試將其轉換為字節 object 並使用bytesobject.h
中的函數,但這似乎也不對嗎?
我也試過
PyBytes_AsStringAndSize(PyObject* obj, char** s, Py_ssize_t* len);
但這無法抱怨 obj 不是bytes
類型。
您可以將PyArg_ParseTuple()
與“s”格式一起使用。
void foo(PyObject * args)
{
const char *command;
if (!PyArg_ParseTuple(args, "s", &command))
return; /* fails! */
/* Use 'command'. */
...
}
如果您只需要查看從 Python 到“C”的數據。 我認為這適用於 Python 的所有版本,並且我已將其與 3.8.10 一起使用。
如果您需要提供新字符串, PyUnicode_FromString()
將起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.