2010-12-27 15 views
5

Escribo una clase de Python en C y quiero poner aserciones en mi código de depuración. assert.h me sienta bien. Esto solo se pone en compilaciones de depuración, por lo que no hay posibilidad de que una falla afirmativa afecte a un usuario del código Python *.¿Cómo puedo afirmar desde el código Python C?

Estoy tratando de dividir mi código de 'biblioteca' (que debe estar separado del código vinculado contra Python) para poder usarlo desde otro código C. Por lo tanto, los métodos de My Python son envoltorios delgados en torno a mi código C puro.

Así que no puedo hacer esto en mi código 'biblioteca':

if (black == white) 
{ 
    PyErr_SetString(PyExc_RuntimeError, "Remap failed"); 
} 

porque esto contamina mi código pura-C con Python. Es también mucho más feo que un simple

assert(black != white); 

Creo que el compilador Distutils siempre establece NDEBUG, lo que significa que no puedo usar assert.h incluso en versiones de depuración.

Mac OS y Linux.

¡Ayuda!

* un argumento que he escuchado contra la afirmación en el código C llamado desde Python.

Respuesta

7

Simplemente use assert.h. Es un mito que distutils siempre define NDEBUG; solo lo hace para msvc de Microsoft en Windows, y solo cuando se invoca desde una versión de lanzamiento de Python (no desde una versión de depuración de Python).

Para definir NDEBUG en sus propias versiones de lanzamiento, pase una opción de línea de comando -D a setup.py build_ext.

Editar: Parece que NDEBUG se define de forma predeterminada a través de la configuración de inhabilitación del Makefile de Python. Para reiniciar, ejecute

OPT="-g -O3" python setup.py build 
+0

¡Eso es lo que quiero escuchar! Entonces, cuando ejecuto 'python setup.py build' o' python setup.py build --debug' obtengo algo como: 'gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -O2 -DNDEBUG -g -O3 -g -UDEBUG -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c thing.c -o build/temp.macosx-10.6-intel -2.7/thing.o'. ¿Cómo eliminaría el NDEBUG? – Joe

+0

@Joe: Ya veo; ver mi edición –

+0

Eso realmente no resuelve el problema. No es una buena solución decirle a todos sus usuarios que usen un comando de compilación personalizado si desea habilitar las afirmaciones en todos los casos.Esto debe solucionarse de alguna manera de una manera limpia en 'setup.py'. – Albert

2

Crea tu propia macro, como myassert() para diferentes situaciones. O cree una macro, que comprueba una variable global para ver si la macro se usa desde el código de Python o C. "normal". El punto de entrada del módulo de Python tendría que establecer esta variable en verdadero, o podría usar indicadores de función, uno para Python código, otro predeterminado para el código C.

2

UNDEFINE la macro NDEBUG en su setup.py:

ext_modules = [Extension(
    ... 
    undef_macros=['NDEBUG'], 
)] 

Esto dará lugar a una línea de comando como

gcc ... -DNDEBUG ... -UNDEBUG ... 

Qué (mientras fea) hace lo correcto cosa, es decir, mantiene las aserciones habilitadas.

Cuestiones relacionadas