sci*_*tor 2 pre-compilation cython
我正在寻找一种在 cython 文件中添加预编译器逻辑的解决方案。
我已经为 C++ 中的硬件设备 API 编写了一个 cython 包装器。这是一个 cython 项目,通常使用 MSVC for 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
Run Code Online (Sandbox Code Playgroud)使用类似 python 的with块
with ifdef('__WINAPI'):
def foo():
print('bar win')
Run Code Online (Sandbox Code Playgroud)用类似 cython 的行结束符结束函数
def foo() ifdef('__WINAPI'):
print('bar win')
def foo() ifndef('__WINAPI'):
print('bar win')
Run Code Online (Sandbox Code Playgroud)从评论中扩展出一个简短的答案:这是Cython 支持的功能。它允许您定义编译时常量
DEF a = 5
Run Code Online (Sandbox Code Playgroud)
并根据这些常量有条件地包含代码:
IF a==5:
cdef f():
return 1
ELSE:
cdef f():
return 2
Run Code Online (Sandbox Code Playgroud)
它还定义了一些有用的常量:UNAME_SYSNAME例如,让您可以在 Windows、OS X 和 Linux 之间进行选择。
这些表达式是在 Cython 在 .pyx 文件上运行时计算的 - 因此生成的 C 代码在 Windows 与 Linux 上是不同的,因此如果您想在另一个平台上编译,您需要重新运行 Cython,而不是只需重新编译 C 文件即可。
Cython 中没有与 C #ifdef/直接等效的#ifndef功能 - 测试是否定义了编译时常量不是受支持的功能。
| 归档时间: |
|
| 查看次数: |
1958 次 |
| 最近记录: |