一个作者能否编写一个库API–;一个可在Python之外访问–;使用Cython?

一个作者能否编写一个库API–;一个可在Python之外访问–;使用Cython?,python,c++,c,api,cython,Python,C++,C,Api,Cython,我知道Cython的目的是创建Python扩展模块,但是用Cython编译的库可以由非Python程序加载吗?如果没有,原因是什么?我怀疑您是否可以在非python程序上直接加载它们;看看最简单的Cython脚本生成的C代码,很明显,您需要所有的Python脚手架才能使其工作。也就是说,你可以间接地从C++中做。在C++中,我使用Python解释器,并加载一些模块和脚本。这可能看起来很复杂,但是只要你建立了适当的粘贴代码(参见),你就可以快速使用已经在Python中编写的C++扩展(参见)。 这

我知道Cython的目的是创建Python扩展模块,但是用Cython编译的库可以由非Python程序加载吗?如果没有,原因是什么?

我怀疑您是否可以在非python程序上直接加载它们;看看最简单的Cython脚本生成的C代码,很明显,您需要所有的Python脚手架才能使其工作。也就是说,你可以间接地从C++中做。在C++中,我使用Python解释器,并加载一些模块和脚本。这可能看起来很复杂,但是只要你建立了适当的粘贴代码(参见),你就可以快速使用已经在Python中编写的C++扩展(参见)。 这种方法的缺点是,您实际上是在加载一个完整的Python解释器,以便能够使用一些扩展。这对我来说不是问题,因为我已经有了python扩展,并将python嵌入到我的应用程序中以提供基本的脚本能力,但我不会使用这种方法来编写新的库

外部有
cdef
'ed Cython结构可用:

  • –和/或
  • 以下是两种机制的示例之一,摘自上述链接页面:

    cdef公共结构车辆:
    整数速度
    浮力
    cdef api无效激活(车辆*v):
    如果v.speed>=88和v.power>=1.21:
    打印“实现时间旅行”
    
    这些方法中的每一种都将指示Cython编译器生成一个头文件(“.h”),然后您可以将其与正交C/C++项目集成

    一个
    cdefpublic
    声明产生一个名为
    modulename.h
    的文件;使用此文件中的结构需要链接已编译的Cython扩展模块

    api
    声明(如果您愿意,可以与
    cdef public
    同时使用)生成
    modulename_api.h
    文件;使用基于
    api
    的头文件的代码不需要链接到扩展模块,但需要调用
    cdef
    'd函数
    import\u modulename()
    ,然后才能使用任何api代码(NumPy的Cython用户会采用这种策略)


    以我个人的经验,只要结构布局与消费代码很好地吻合,以这种方式公开并随后使用Encythond结构作为外部API几乎不费吹灰之力,你愿意在C/C++代码中手动管理GIL以使其正常工作。

    很大程度上取决于所讨论的库使用的Cython功能。你为什么要首先这样做?用Python构建库?我感到惊讶的是,事实上这并不常见……对,谷歌正在寻找几种可用的实用工具,以便在C/C++程序中嵌入Python。Boost不是唯一一个。。。