编译成功后无法导入已编译的cython函数

时间:2017-10-13 08:30:31

标签: python cython

我在{10}之后测试了Windows 10(Spyder 3.2.3)和Python 3.6.3上的Cython,并且我编写了这个函数:

from libc.stdlib cimport malloc, free

cdef int** t3(int* El, int lEl):
    cdef int lElsq = lEl*lEl
    cdef int i,j
    cdef int** rr = <int**> malloc(2*sizeof(int*))
    for i in range(2):
        rr[i] = <int*> malloc(lElsq*sizeof(int))
    for i in range(lEl):
        for j in range(lEl):
            rr[0][i*lEl+j] = El[i]
            rr[1][i*lEl+j] = El[j]
    return rr

我将它放入pyx文件中,并按照教程使用MS Visual Studio 14编译器编译它。

命令:%run setup.py build_ext --inplace

设置文件:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("tempCython.pyx"),
)

编译没有抛出任何错误,并且创建了大量文件:

在与原始文件相同的目录中:

  • 同名的tempCython.c文件
  • 一个tempCython.cp36-win_amd64.pyd文件

在子目录build\temp.win-amd64-3.6\Release中:

  • 一个tempCython.obj文件
  • 一个tempCython.cp36-win_amd64.exp文件
  • 一个tempCython.cp36-win_amd64.lib文件

Tutorial告诉我我需要pyd文件,因此我删除了文件名中的cp36-win_amd64

我可以毫无错误地导入它,但我的函数t3从未显示过,它根本就不存在。

没有任何错误信息,我现在感到茫然。我有时在第三方软件包中遇到过这样的错误,但我从来没有理解是什么导致了它们。为什么我的功能不在那里?

我还想知道所有这些附加文件的重点,我实际需要哪些文件?

1 个答案:

答案 0 :(得分:1)

您已编写cdef函数并尝试从python中调用它。不幸的是,cdef函数在python中是不可见的(参见http://docs.cython.org/en/latest/src/userguide/language_basics.html#python-functions-vs-c-functions)所以你需要做更多的工作来将你的函数暴露给python。特别是你需要编写调用def函数的cpdef函数或cdef函数,然后从python中调用 函数。