2010-12-27 22 views
5

私はPythonクラスをC言語で書いています。私はデバッグコードにアサーションを入れたいと思います。 assert.h私はうまく合わせます。これはデバッグコンパイルの中に置かれるだけなので、アサーションの失敗がPythonコード*のユーザに影響することはありません。Python Cコードからどのようにアサートできますか?

私は他のCコードから使用できるように私の 'ライブラリ'コード(Pythonにリンクされたコードとは別にすべきです)を分割しようとしています。私のPythonメソッドは、私の純粋なCコードの周りに薄いラッパーです。

だから、私は「ライブラリ」のコードでこれを行うことはできません。

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

これは、Pythonと私の純粋なCのコードを汚染するので。また、私はDistutilsのコンパイラは、常に私はデバッグビルドにおいてもassert.hを使用することはできませんを意味し、NDEBUGを設定することを信じて、簡単な

assert(black != white); 

よりもはるかに醜いです。

Mac OSとLinux。

ヘルプ!

*私はPythonから呼び出されたCコードでアサートすることに関して聞いた1つの議論です。

答えて

7

ちょうどassert.hを使用してください。 distutilsが常にNDEBUGを定義するのは神話です。それは、Windows上のMicrosoftのmsvcの場合だけであり、Pythonのリリースビルド(Pythonのデバッグビルドからではない)から呼び出されたときにのみそうです。

独自のリリースビルドでNDEBUGを定義するには、-Dコマンドラインオプションをsetup.py build_extに渡します。

編集NDEBUGは、デフォルトでPythonの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/Versions/2.7/include/python2.7 -c thing.c -o build/temp.macosx-10.6-intel -2.7/thing.o'。どうすればNDEBUGを削除できますか? – Joe

+0

@ジョー:そうです。私の編集を参照してください。 –

+0

それは本当に問題を解決しません。すべてのケースでアサートを有効にする場合は、すべてのユーザーにカスタムビルドコマンドを使用するように指示するのは良い解決策ではありません。これは何らかの形で 'setup.py'でクリーンな方法で修正する必要があります。 – Albert

2

状況ごとにmyassert()などの独自のマクロを作成します。または、グローバル変数をチェックして、マクロがPythonコードまたは "normal" Cから使用されているかどうかを確認するマクロを作成します。Pythonモジュールのエントリポイントでこの変数をtrueに設定するか、関数ポインタを使用できますコード、もう一つはCコードのデフォルトです。

2

を実行します。

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

これは正しい処理を行い(醜い中)

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

のようなコマンドラインになりますそれは、アサーションを有効にしたままにします。