Cython:使其他Cython模块可以访问外部C函数

时间:2017-01-07 20:19:29

标签: c cython

如果我在外部库中有C函数void foo(),我可以在module1.pyx中执行

cdef extern from "fooHeader.h":
    void foo();
...
foo()

但是,如果不使用包装函数,我可以将此函数公开用于其他Cython模块吗?

例如,使用module1.pxd

cdef extern void foo()

不会在module2.pyx

中提供该功能
from module1 cimport foo
foo()

以未定义的符号错误中止。

1 个答案:

答案 0 :(得分:0)

典型的方法是创建一个包装器,因为当你将这些函数暴露给 Python 代码时,你通常想要拦截类型等。在我的头脑中,你可能最简单的方法就是使用Cython的包含文件工具,并使用.pxi个文件:

https://cython.readthedocs.io/en/latest/src/reference/language_basics.html#include-file

链接的摘录:

  

我该如何使用它?

     
      
  • 在.pxi文件中包含include语句,例如:include“spamstuff.pxi”
  •   
  • include语句可以出现在Cython文件中的任何位置以及任何缩进级别
  •   
  • .pxi文件中的代码需要以“零”缩进级别为根。
  •   
  • 包含的代码本身可以包含其他包含语句。
  •   

因此,您需要将cdef extern <...>内容放入.pxi文件中并将其包含在所有用户中。

(旁注:我不记得你是否可以通过.pxd接口文件公开extern模块。可能也可以工作,但我没有检查过。 )