【问题标题】:How to convert void* type in C to string type in python?如何将 C 中的 void* 类型转换为 python 中的字符串类型?
【发布时间】:2018-09-28 05:57:06
【问题描述】:

在使用 Cython 封装 C 语言时,我尝试将 C 中的 void* 类型转换为 python 中的 string,但是在转换 C 语言时,我不知道如何将 void* 类型转换为 string int to python Py_ssize_t,like(类的一部分):

cpdef int peek_tail(self):
    cdef int value = <Py_ssize_t>cqueue.queue_peek_tail(self._c_queue)

当我想将其转换为string时,我该如何定义它?

cpdef ? peek_tail(self):
    cdef ? value = <?>cqueue.queue_peek_tail(self._c_queue)

? 是我想要的。有任何文件吗?

【问题讨论】:

  • “转换”是什么意思? void *-pointer 是否指向 python 字符串并且您想将其 cast 到字符串对象?或者它可以是任何PyObject * 并且您想将其转换为它的字符串表示形式?
  • 并且在问题中包含cqueue(无论是什么)并不能增加清晰度 - 而是相反..
  • @ead 我假设cqueue 取自this tutorial。它不会改变一些未知类型已隐藏在 void* 后面的事实,并且应该以某种方式将其转换为字符串而不知道它是如何放在那里的......
  • @littlely 这里还有一件事要担心 - 如果您打算使用 C 字符串 (char*),您可能需要考虑管理内存。如何做到这一点取决于 C 字符串的来源(字符串文字,在 C 中生成,例如sprintf,或从 Python 字符串转换而来)。不幸的是,没有明显正确的方法来做到这一点......

标签: python c cython


【解决方案1】:

您可以在cdef 上使用char*,但由于您使用cpdef,您也可以对字节(py2)或unicode(py3)执行str。我相信queue_peek_tail 返回的总是Py_ssize_t

请参阅here 了解更多具体信息。尤其是那一行

一般来说:除非您知道自己在做什么,否则请尽可能避免使用 C 字符串,而改用 Python 字符串对象。

【讨论】:

  • 它可以转换为 PyObject*,所以我可以添加 python 对象吗?
猜你喜欢
  • 2021-01-13
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2013-10-16
  • 1970-01-01
相关资源
最近更新 更多