2010-09-29 2 views
2

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

Конкретно эти два случая теперь мне интересно:

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

Спасибо

+0

На самом деле второй момент нежизнеспособен, так как, как я узнал, Cython фактически не анализирует внешние файлы заголовков. – ron

+0

Лучший ответ на аналогичную проблему приведен в http://stackoverflow.com/questions/26225187/try-statement-in-cython-for-cimport-for-use-with-mpi4py/26226758#26226758. (Я не знаю, было ли это жизнеспособным решением, когда задавался этот вопрос) – DavidW

ответ

12

Вы могли бы генерировать PXI файл и включить его прежде чем делать IF Это то, что мы делаем в Kivy setup.py, например (такой же, как ./configure генерирует config.h тоже.):

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 
+0

Вы также можете сделать одно и то же поколение «config.h» с помощью дубликата и изменить «DEF% s =% d'' to » #define% s% d'' – tito

+0

Я обнаружил, что редактирование этого файла не приводит к сбою кэша этого файла. т. е. если вы измените config.pxi, старый будет по-прежнему построен. так или иначе? –

+0

ah получил способ, нужно включить config.pxi в исходные_файлы в setup.py –

2

На самом деле второй вариант проще. Создание FLAG в некотором файле .h, а затем сделать

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

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

if FLAG: 
    ... 

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

+0

Это работает нормально для простых вещей, но это не позволит вам делать условные externs, тогда как принятый ответ. – totaam

+0

, и это не позволит вам 'ctypedef' решать, например, между одноточечными и двойными точками точности. Таким образом, принятый ответ, безусловно, более мощный –

Смежные вопросы