使用Cython编译的外部C函数无法识别

时间:2018-04-17 15:54:22

标签: python cython

我正在尝试学习Cython,并设法在文件中直接编译带有函数定义的.pyx。

我的下一步是尝试编译.pyx链接外部C函数。编译成功,但是当我尝试在Python脚本中导入模块时,找不到该函数。

在文件" Cython-C.pyx":

cdef extern from "svar.h":
    unsigned long long int svar()

在文件" setup.py":

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension(name="Nej", sources=["Cython-C.pyx"])]
setup(
      name = 'blublu',
      cmdclass = {'build_ext': build_ext},
      ext_modules = ext_modules
)

我根据网络上的答案尝试了不同的来源,例如: sources = [" Cython-C.pyx"])],sources = [" svar.h"," Cython-C.pyx"])],来源= [" svar.c"," Cython-C.pyx"])]等。

在文件" svar.c":

#include "svar.h"

unsigned long long int svar(){
unsigned long long int i;
unsigned long long int c;
for(i=0; i<100000000; ++i)
{
    c=i/(i+1);
}
return c;
}

在档案&#34; svar.h&#34;:

unsigned long long int svar();

我使用以下命令在Windows上编译它:

python setup.py build_ext --inplace

在文件&#34; CWrapperTest.py&#34;:

import Nej

print(Nej.svar())

结果&#34;属性错误:模块&#39; Nej&#39;没有属性&#39; svar&#39;&#34;

Nej确实没有包含&#34; svar&#34;:

dir(Nej)
Out[2]: 
['__builtins__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '__test__']

我的目标只是为了学习目的而努力获得绝对最基本的东西。我不认为文档在这个问题上已经足够清楚了。

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

外部C函数只导出到Cython - 它们不能直接从Python调用。您需要创建一个Cython包装函数:

cdef extern from "svar.h":
    unsigned long long int svar()
def svar_py():
    return svar()

您可以从Python调用svar_py

(令我意外的是,这似乎没有很好的记录,也许应该是)。

setup.py文件中的正确行将是

sources=["svar.c","Cython-C.pyx"])]