Poniższy kod może być to, co jesteś po
Korzystanie python3.4
:
>>> import sysconfig
>>> sysconfig.get_config_var('Py_DEBUG')
0
Z drugiej strony za pomocą python3.4-dbg
:
>>> import sysconfig
>>> sysconfig.get_config_var('Py_DEBUG')
1
Jednak są też skompilować opcje czasowe kontrolujące zachowanie "debugowania", takie jak NDEBUG
menti tutaj: http://bugs.python.org/issue17411.
Innymi słowy: chociaż Py_DEBUG
może być unieważniony (0), kod C-Code, który jest kontrolowany przez NDEBUG
, może nadal zmieniać zachowanie Pythona. Ustawienie Py_DEBUG
zawsze usuwa NDEBUG
, powodując zastosowanie przydziałów. Brak Py_DEBUG
nie ma wpływu na NDEBUG
- może on być zdefiniowany lub nie. Jeśli zdefiniowano NDEBUG
, asserts zostanie zdefiniowane jako puste makro.
Od http://en.wikipedia.org/wiki/Assert.h:
Programiści może wyeliminować twierdzeń tylko przez rekompilacji programu , bez zmiany kodu źródłowego: jeśli makro NDEBUG jest zdefiniowane przed włączeniem, na assert() makro jest definiowana jako:
#define assert(ignore)((void) 0)
możliwe, ale nieprzenośne, rozwiązaniem byłoby sprawdzić wiersza poleceń kompilatora OPT
na to:
>>> '-DNDEBUG' not in (sysconfig.get_config_var('OPT') or '')
gdzie OPT
może być na przykład
>>> sysconfig.get_config_var('OPT')
'-DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes'
Wow, nie wiedziałem o tym. +1 – vaultah
Jest to jeden z powodów, dla których nienawidzę twierdzeń o C - ktoś wiedział, że coś może pójść nie tak, ale zamiast obsługiwać go, wybrał opcję testowania go ** tylko w kompilacjach debugowania **, a rzeczy mogą trafić do piekła w dostarczanym pliku code - * (rant over, śledziona wentylacja)! * –
Niepowtarzalny tak, ale przynajmniej działa na prawdziwych systemach operacyjnych, nie wiedział o Py_DEBUG i NDEBUG w sysconfig lub ich znaczeniach, dziękuję. –