基于外部值的Cython条件编译

时间:2010-09-29 22:50:18

标签: conditional cython conditional-compilation

我尝试从Cython pxd有条件地编译(或生成)到c代码。我读到我可以DEF来定义一个值,并根据它的值有条件地生成IF,但是如何从pxd文件外部获取这个值?

具体来说,这两个案例对我来说很有意思:

  • 给Cython一些命令行定义,最好是通过Cython.Distutils setuptools方式
  • extern-ed C头文件定义了一些值,并根据此值有条件地定义使用Cython(现在可能不可能?)

谢谢

2 个答案:

答案 0 :(得分:12)

您可以生成一个pxi文件,并在执行IF之前包含它(与./configure一样生成一个config.h)。 这就是我们在Kivy setup.py中所做的事情,例如:

c_options = { 
'use_opengl_es2': True,
'use_opengl_debug': False,
'use_glew': False,
'use_mesagl': False}

print 'Generate config.pxi'
with open(join(dirname(__file__), 'kivy', 'graphics', 'config.pxi'), 'w') as fd:
    for k, v in c_options.iteritems():
        fd.write('DEF %s = %d\n' % (k.upper(), int(v)))

然后,在你的pxd:

include "config.pxi"
IF USE_OPENGL_DEBUG == 1:
  # do other import or whatever you want

答案 1 :(得分:2)

实际上,第二种选择更容易。在某个.h文件中创建一个FLAG,然后执行

cdef extern from "header.h":
    cdef int FLAG

然后当你想使用它时,只需写下

if FLAG:
    ...

即使Cython将生成代码,C编译器也会自动修剪它,因为它在编译时知道FLAG的值。