Python有权将字符串的内部表示保留在任何非标准格式中。因此,您必须首先将字符串转换为字节,例如使用.encode('utf-8')
或任何其他编码格式。
在您有可用的字节之后,您可以通过将字节分配给char *
变量来轻松地将它们转换为指针,在Cython代码中只需执行以下操作:
s = 'abc'
b = s.encode('utf-8') + b'\x00'
cdef const char * ptr = b
注意上面的代码中我在字节串后添加了
b'\x00'
,因为字节串的表示形式不必在末尾包含零字节,而C/C++在接受
char *
字符串时需要该零字节。
同样地,如果C/C++代码返回了
char *
,那么你可以按照以下方式轻松地将其转换回字符串:
cdef const char * ptr = ....
b = <bytes>ptr
s = s.decode('utf-8')
在上面的代码中,注意通过
<bytes>ptr
将
char *
转换为字节。Cython通过搜索第一个零字节并截断字符串来将
char *
强制转换为字节,最终字节不包含零字节。
现在,您还可以创建
char **
数组以将其传递给C/C ++,如下面的代码所示。 我假设您正在编译64位二进制文件(具有64位指针):
import numpy as np
cimport numpy as np
cimport cython
from libc.stdint cimport *
def cython_func():
ss = ['ab', 'cde', 'f']
bs = [e.encode('utf-8') + b'\x00' for e in ss]
a = np.zeros(len(bs), dtype = np.uint64)
for i in range(len(bs)):
a[i] = <uint64_t>(<char *>bs[i])
cdef uint64_t[:] ca = a
cdef char ** final_ptr = <char **>&ca[0]
with nogil:
some_c_func(final_ptr)