Cython условной компиляции на основе внешнего значения - PullRequest
2 голосов
/ 30 сентября 2010

Я пытаюсь условно скомпилировать (или сгенерировать) код c из pxd Cython.Я прочитал, что могу DEF определить значение a и IF, чтобы сгенерировать условно на основе его значения, но как я могу получить это значение, чтобы получить извне файла pxd?

В частности, эти два случая интересны для менясейчас:

  • дает некоторое определение командной строки для Cython, предпочтительно через путь установки Cython.Distutils
  • внешний заголовочный файл C определяет некоторое значение и условно определяет с помощью Cythonна основе этого значения (может быть, сейчас невозможно?)

Спасибо

Ответы [ 2 ]

12 голосов
/ 02 марта 2011

Вы можете сгенерировать файл 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
2 голосов
/ 09 марта 2011

На самом деле второй вариант проще.Создайте ФЛАГ в некотором файле .h и затем выполните

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

, затем, когда вы захотите его использовать, просто напишите

if FLAG:
    ...

, и хотя Cython сгенерирует код, Cкомпилятор автоматически обрезает это, поскольку он знает значение FLAG во время компиляции.

...