2010-09-29 5 views
2

Je tente de compiler conditionnellement (ou de générer) du code c à partir d'un pxd Cython. J'ai lu que je peux DEF pour définir une valeur et IF pour générer conditionnellement en fonction de sa valeur, mais comment puis-je obtenir cette valeur à l'extérieur du fichier pxd?Compilation conditionnelle Cython basée sur la valeur externe

Plus précisément ces deux cas sont intéressants pour moi maintenant:

  • donnent une ligne de commande définissent à Cython, de préférence à travers le chemin de Cython.Distutils
  • le fichier d'en-tête extern-ed C définit une certaine valeur et définir conditionnellement à l'aide Cython en fonction de cette valeur (peut-être maintenant impossible?)

Merci

+0

En fait, le second point n'est pas viable, puisque j'ai appris que Cython n'analyse pas réellement les fichiers d'en-tête externes. – ron

+0

Une meilleure réponse à un problème similaire est donnée dans http://stackoverflow.com/questions/26225187/try-statement-in-cython-for-cimport-for-use-with-mpi4py/26226758#26226758. (Je ne sais pas si c'était une solution viable quand cette question a été posée) – DavidW

Répondre

12

vous pouvez générer un fichier PXI et l'inclure avant de faire votre SI C'est ce que nous faisons dans Kivy setup.py par exemple (comme ./configure générer un config.h aussi.):

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))) 

Et puis, dans votre pxd:

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

Vous pouvez aussi faire la même génération d'un "config.h" en double et changer "'DEF% s =% d'' en' ' #define% s% d'' – tito

+0

J'ai trouvé que l'édition de ce fichier ne déclenche pas le contournement du cache de ce fichier. c'est-à-dire que si vous changez config.pxi, l'ancien sera toujours construit. de toute façon autour de ça? –

+0

ah a un chemin, besoin d'inclure config.pxi dans source_files dans votre setup.py –

2

En fait, la deuxième option est plus facile. Créer un drapeau dans un certain .h puis faire

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

alors quand vous voulez l'utiliser, il suffit d'écrire

if FLAG: 
    ... 

et même si Cython va générer le code, le compilateur C coupe automatiquement ce loin car il sait la valeur de FLAG au moment de la compilation.

+0

Cela fonctionne bien pour des choses simples, mais il ne vous permettra pas de faire des externs conditionnels, contrairement à la réponse acceptée. – totaam

+0

et il ne vous laisserait pas 'ctypedef' pour décider, par exemple, entre les flotteurs simple et double précision. Donc, la réponse acceptée est certainement plus puissante –

Questions connexes