基于通过'setuptools'给定的外部值进行Cython条件编译

5
我尝试从Cython pyx文件条件生成C代码。我在Cython文档中发现可以使用DEF定义一个值和IF根据定义的值有条件地生成代码,但是我如何通过setuptools中的Extensionsetup.py设置该值。
谢谢!

1
你要找的答案在这个回答中展示了。 - IanH
1个回答

5

感谢提供链接。

setup.py中的有趣标志是cython_compile_time_env。要从Cython导入Extension

from setuptools import setup
from Cython.Distutils.extension import Extension

ext = Extension(
    name,
    include_dirs=include_dirs,
    cython_compile_time_env=dict(OPENMP=True),
    sources=['test.pyx'])

setup(name=name,
      cmdclass=dict(build_ext=build_ext),
      ext_modules=[ext])

test.pyx 文件中:

...
IF OPENMP:
#Do openmp
ELSE:
#No openmp
...

Cython条件语句(上面是IF...ELSE)的文档可以在此处查看:这里

1
这里是Cython添加此功能的报告。它没有很好的文档记录。有时候会被告知使用关键字pyrex_compile_time_env而不是cython_compile_time_env。还值得注意的是,如果您的setuptools目录无法以不明显的方式清除,则构建新的编译时变量将只使用先前缓存的结果。即使使用python setup.py clean --all也无法避免这种情况。我最终只是在每次构建之前touch了我的.pyx文件。 - dubiousjim
cythonize函数的用户相关:https://github.com/cython/cython/issues/1572 - 0 _
1
cythonize参数compile_time_env的示例用法:https://github.com/pywr/pywr/blob/80784dfbe1aa0fc143247f4304c5f5eaa0dd3809/setup.py#L151 - 0 _
在更复杂的设置中,当您拥有更多信息时(例如class custom_build_ext(build_ext): ... def build_extensions(self): self.cython_compile_time_env = {}),您可能希望稍后修改环境(只是一个字典)。 - Fred Schoen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接