使用" PyUnicode_AsUTF8"时出错

时间:2018-06-10 13:35:55

标签: cython

我正在尝试在Cython中编写一个函数来处理一串字符串。在下面的代码中,我试图将一个unicode str对象列表(在Python 3中)转换为char*的表,然后使用该表来搜索子字符串。

我找到了Python 2 here的解决方案,但是此解决方案依赖于仅在Python 2中可用的对象PyString_AsString,而在Python 3中我们应该使用PyUnicode_AsUTF8,我发现了here。当我尝试使用PyUnicode_AsUTF8时,我遇到了这个错误:

  

:31:16:' PyUnicode_AsUTF8'不是常量,变量或函数标识符

我几乎没有想法。无论我尝试什么都会导致某种错误。

代码

import cython
from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
from cpython.string cimport PyUnicode_AsUTF8
from libc.string cimport strstr

@cython.boundscheck(False)
def start(itsstr, tokens):
    cdef size_t s
    cdef size_t t
    cdef size_t ns = len(itsstr)
    cdef size_t nt = len(tokens)
    cdef const char** t_str = _char_table(itsstr, ns)
    cdef const char** t_tok = _char_table(tokens, nt)
    cdef unicode x
    for s in xrange(ns):
        for t in xrange(nt):
            if strstr(t_str[s], t_tok[t]):
                x = itsstr[s]
    PyMem_Free(t_str)
    PyMem_Free(t_tok)

cdef const char** _char_table(s, const size_t n):
    cdef char** t = <char**>PyMem_Malloc(n * sizeof(char*))
    cdef size_t i = 0
    for i in xrange(n):
        temp = PyUnicode_AsUTF8(s[i])
        t[i] = temp
    return t

1 个答案:

答案 0 :(得分:1)

Cython不会将函数PyUnicode_AsUTF8包装在cpython.string中。所以你必须自己做:

#instead of from cpython.string cimport PyUnicode_AsUTF8
cdef extern from "Python.h":
    const char* PyUnicode_AsUTF8(object unicode)

实际上,在Python 3.7之前的版本中它是char * PyUnicode_AsUTF8(...),但是在它之前使用const也不会因旧版本而干扰Cython。