Cython预编译器决策

时间:2017-11-14 02:17:42

标签: cython pre-compilation

我正在寻找一种在cython文件中添加预编译逻辑的解决方案。

我为C ++中的硬件设备API编写了一个cython包装器。这是一个cython项目,通常使用MSVC为python 2.7和3.6编译。整个包是用cython编写的,无需外部c ++或头文件。

最初,我已编写此软件用于Windows机器,因此我使用了许多基本winapi函数来帮助访问内核事件循环和winapi错误消息。它工作得很好,但我还想为跨平台编译添加功能。这需要我完全替换几个关键功能,使其在Linux机器上运行。例如,硬件API甚至具有不同的事件处理功能,具体取决于操作系统。此外,需要更换winapi事件处理。

现在,我将整个项目编译成一个单独的模块以简化导入。所有代码都驻留在编译为hwmodule.pyd文件的同一pyx文件中。但是,为了实现跨平台编译的目标,我需要在设置时从几个小的pyx文件中将文件一起修补。该解决方案不优雅且难以维护。更不用说,培训可能想要添加到项目中的其他人更加困难。

理想情况下,我可以编写cython到c编译时标志,这些标志根据标志或变量进行解释和编译。在cython中有没有可以实现我的目标的解决方案?或者,是否存在一个优雅且易于维护的不同组织?

可能的语法(可能存在或可能不存在)的一些示例,类似于c或python中的语法:

  • 使用#ifdef或类似声明

    #ifdef __WINAPI
    def foo():
        print('bar win')
    #else
    def foo():
        print('bar linux')
    #endif
    
  • 使用类似python的with

    with ifdef('__WINAPI'):
        def foo():
            print('bar win')
    
  • 以类似cython的行尾结束函数

    def foo() ifdef('__WINAPI'):
        print('bar win')
    
    def foo() ifndef('__WINAPI'):
        print('bar win')
    

1 个答案:

答案 0 :(得分:1)

评论中简要回答:a feature that Cython supports。它允许您定义编译时常量

DEF a = 5

并根据这些常量有条件地包含代码:

IF a==5:
    cdef f():
        return 1
ELSE:
    cdef f():
        return 2

它还定义了一些有用的常量:UNAME_SYSNAME允许您在Windows,OS X和Linux之间进行选择。

这些表达式在Cython在.pyx文件上运行时进行评估 - 因此在Windows与Linux上生成的C代码不同,因此如果您想在另一个平台上编译,则需要重新编译运行Cython,而不仅仅是重新编译C文件。

相关问题