簡體   English   中英

從 Python 3 中的 str PyObject 中提取 char*

[英]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 不存在,而是bytesobjectunicodeobject.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM