2010-12-27 4 views
5

C로 파이썬 클래스를 작성 중이며 디버그 코드에 어설 션을 넣을 수 있습니다. assert.h은 나에게 잘 어울립니다. 이것은 디버그 컴파일에만 적용되기 때문에 파이썬 코드 * 사용자에게 영향을주는 어설 션 오류의 가능성은 없습니다.어떻게 파이썬 C 코드에서 어설 션 할 수 있습니까?

다른 C 코드에서 사용할 수 있도록 내 '라이브러리'코드 (파이썬에 연결된 코드와 분리되어 있어야 함)를 나누려고합니다. 따라서 내 Python 메서드는 내 순수 C 코드 주위에 엷은 래퍼입니다.

그래서 난 내 '라이브러리'코드에서이 작업을 수행 할 수 없습니다

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

를이 파이썬 내 순수 C 코드를 오염 때문이다. 또한 나는의 distutils 컴파일러는 항상 내가 디버그 빌드도에서 assert.h을 사용할 수 없습니다 의미 NDEBUG을 설정 믿고 간단한

assert(black != white); 

보다 훨씬 더 추악한입니다.

Mac OS 및 Linux.

도움말!

파이썬에서 호출 된 C 코드에서 주장한 한 가지 주장이 있습니다.

답변

7

그냥 assert.h을 사용하십시오. distutils가 항상 NDEBUG을 정의한다는 것은 신화입니다. Windows에서 Microsoft의 msvc에 대해서만 수행하고 Python 릴리스 빌드 (Python 디버그 빌드가 아닌)에서 호출 할 때만 수행합니다.

자신의 릴리스 빌드에서 NDEBUG를 정의하려면 -D 명령 줄 옵션을 setup.py build_ext에 전달하십시오.

편집 : NDEBUG는 기본적으로 파이썬의 Makefile의 OPT 설정을 통해 정의 된 것으로 보입니다. 이를 재설정하려면 setup.py에 NDEBUG 매크로 정의를 해제

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

내가 듣고 싶습니다! 그래서,'python setup.py build' 나'python setup.py build --debug'를 실행하면'gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -O2 -DNDEBUG -g -O3 -g -UDEBUG -I/라이브러리/프레임 워크/Python.framework/버전/2.7/include/python2.7 -c thing.c -o 빌드/temp.macosx-10.6-intel -2.7/thing.o'. NDEBUG를 제거하려면 어떻게해야합니까? – Joe

+0

@ Joe : 알겠습니다. 내 편집을 참조하십시오. –

+0

그건 문제를 해결하지 못합니다. 모든 경우에 어설 션을 사용하려는 경우 모든 사용자에게 사용자 정의 빌드 명령을 사용하도록 알리는 것은 좋은 해결책이 아닙니다.이것은'setup.py'에서 어떻게 든 깨끗한 방법으로 수정되어야합니다. – Albert

2

상황에 따라 myassert()과 같은 고유 한 매크로를 만듭니다. 또는 전역 변수를 검사하여 매크로가 Python 코드 또는 "normal"에서 사용되는지 확인합니다. C. Python 모듈 진입 점은이 변수를 true로 설정해야하거나 함수 포인터를 사용할 수 있습니다. 하나는 Python 코드, C 코드의 다른 기본 코드

2

을 실행

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

이것은 (추한 동안) 올바른 수행

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

어떤 같은 명령 줄에서 발생합니다 즉, 어설 션을 사용 가능하게 유지합니다.