使用Cython

时间:2017-09-19 14:29:29

标签: cython

如何使用文件simulate_fast.c中的C函数Cython进行编译,这也取决于更多的C文件matrix.crandom_generator.c。这似乎必须是Cython的常见用法,但在阅读完文档之后,我仍然无法弄清楚如何去做。我的目录包含以下文件

matrix.c
matrix.h
random_generator.c
random_generator.h
simulate_fast.c
simulate_fast.h
test.c
simulate_fast_c.pyx
setup.py

matrix.crandom_generator.c文件包含独立功能。 simulate_fast.c文件使用这两个文件并包含我想要向Python公开的函数simulate()test.c文件测试所有C功能是否正确运行,即我可以执行

$ gcc test.c simulate_fast.c matrix.c random_generator.c -o test

编译成可运行的test可执行文件。

我现在的问题是尝试用Cython编译它。我的.pyx文件是

cimport cython

cdef extern from "simulate_fast.h":
    int simulate()

def simulate_cp():
    return simulate()

然后我使用基本的setup.py

from distutils.core import setup
from Cython.Build import cythonize
from Cython.Distutils import build_ext
import numpy as np

setup(
    name='simulate_fast',
    ext_modules = cythonize(["simulate_fast_c.pyx"]),
    include_dirs=[]
)

但是如果我尝试使用

编译它
python3 setup.py build_ext --inplace

我收到错误

In file included from simulate_fast_c.c:492:0:
simulate_fast.h:89:28: error: field ‘RG’ has incomplete type
    struct RandomGenerator RG;

RandomGenerator中声明结构random_generator.h

如何告诉编译器我们在编译时还必须考虑matrixrandom_generator文件。

更新

如果在评论中说ead,我在random_generator.h中加入了matrix.hsimulate_fast.h,那么该程序现在可以编译。但是,当我尝试在Python中导入simulate_fast_c模块时,我得到ImportError

undefined symbol: simulate

此外,如果我将simulate_fast.pyx中的extern声明行更改为

cdef extern from "simulate_fast.c":
    int simulate()

然后我收到导入错误

undefined symbol: get_random_number

这是random_generator.h

中的一个函数

1 个答案:

答案 0 :(得分:1)

cythonized模块必须链接到包含已编译C代码的共享库或嵌入它。后者的一种方法是将C源列为"扩展",然后将此扩展传递给cythonize命令,如Cython's documentation中所述

链接中的示例setup.py文件可以通过(模数导入)来汇总:

setup(
    ext_modules = cythonize(Extension("simulate_fast", ["matrix.c", "random_generator.c", "simulate_fast_c.pyx"]))
)