Cython compilazione condizionale basata sul valore esterno
-
26-09-2019 - |
Domanda
provo a compilare in modo condizionale (o generare) per il codice C da un PXD Cython. Ho letto che posso DEF per definire aa valore e IF per condizionatamente generano in base al suo valore, ma come posso ottenere questo valore per ottenere al di fuori del file PXD?
In particolare questi due casi sono interessanti per me, ora:
- dare qualche riga di comando definiscono a Cython, preferibilmente attraverso modo in cui i Cython.Distutils setuptools
- il file di intestazione C extern-ed definisce un certo valore, e condizionatamente definire usando Cython sulla base di questo valore (forse impossibile ora?)
Grazie
Soluzione
Si potrebbe generare un file PXI, e includerlo prima di fare la vostra IF (stesso di ./configure generare un config.h troppo.) Questo è ciò che facciamo in Kivy setup.py per esempio:
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)))
E poi, nel vostro PXD:
include "config.pxi"
IF USE_OPENGL_DEBUG == 1:
# do other import or whatever you want
Altri suggerimenti
In realtà, la seconda opzione è più facile. Creare un FLAG in qualche file h e poi fare
cdef extern from "header.h":
cdef int FLAG
poi quando si desidera utilizzarlo, basta scrivere
if FLAG:
...
e anche se Cython genererà il codice, il compilatore C taglierà automaticamente questa via come si conosce il valore della FLAG in fase di compilazione.