2014-12-03 38 views
3

我尝试从Cython pyx文件有条件地生成C代码。我在Cython文档中发现我可以使用DEF来定义一个值并且IF根据定义的值有条件地生成代码,但是如何通过Extensionsetup.py设置值从setuptools基于通过setuptools给出的外部值的Cython条件编译

谢谢

+1

你在找什么显示在[这个答案](http://stackoverflow.com/questions/26225187/try-statement-in-cython-for-cimport-for-use-with-mpi4py/26226758# 26226758)。 – IanH 2014-12-04 05:32:52

回答

2

谢谢你的链接。

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)都记录here

+1

这里是[添加到Cython的这个特性的报告](https://github.com/cython/cython/pull/81)。它没有很好的记录。有时会被告知使用关键字“pyrex_compile_time_env”而不是“cython_compile_time_env”。另外值得一提的是,如果你的setuptools目录可能无法以不明显的方式进行清理:那么再次构建新的编译时变量将与先前的缓存结果一致。即使'python setup.py clean --all'也没有避免这种情况。我最终只是在每次构建之前触摸我的'.pyx'文件。 – dubiousjim 2017-02-21 19:30:53

+0

与函数'cythonize'的用户相关:https://github.com/cython/cython/issues/1572 – 2018-01-12 01:19:40

+0

'cythonize'参数'compile_time_env'的示例用法:https://github.com/pywr /pywr/blob/80784dfbe1aa0fc143247f4304c5f5eaa0dd3809/setup.py#L151 – 2018-01-12 01:27:29