我正在尝试学习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__']
我的目标只是为了学习目的而努力获得绝对最基本的东西。我不认为文档在这个问题上已经足够清楚了。
感谢任何帮助,谢谢。
答案 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"])]