我正在寻找一种在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')
答案 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文件。