1

私はPython3.3C-APIを試して、計画されている次のプロジェクトで使用できるかどうかを確認しましたが、ほとんどすぐに問題が発生しました。

この単純なコードでさえ、戻り値として0xc0000005でクラッシュします。

#include <Python.h>
#include <cstdio>

int main(){
    Py_Initialize();

    Py_IncRef(Py_True); //just in case?
    PyObject_Print(Py_True,stdout,Py_PRINT_RAW);
    Py_DecRef(Py_True);

    Py_Finalize();
    return 0;
}

テストでは、PyObject_Printがクラッシュを生成していることが示されています。このコードや私の設定の何が問題になっていますか?

4

2 に答える 2

4

これはおそらく不適切なリンケージによるものです。クラッシュは、コード内の がリンク先の python lib 内のFile*と異なる場合によく発生します。File*これは、好まれていないライブラリが、別のランタイムを使用する別のコンパイラまたは別のバージョンのコンパイラによってコンパイルされた場合に発生する可能性があります。

于 2013-02-18T19:09:12.740 に答える
0

Pyhton 2.x -> 3.x から C モジュールを移動すると、PyObject_Print() がクラッシュしました。

まず、C モジュールの MS VS バージョン (MSC) が Python によって報告されたバージョンと一致することを確認します。

たとえば、python.exe レポートを実行すると、次のように報告されます。

モジュールの init 関数に fprintf を追加します。

fprintf(stderr, "C - MSC_VER %d\n", _MSC_VER);

与える:

C - MSC_VER 1600

次に、コマンド ライン オプションを確認します。繰り返しますが、私の単純なテスト モジュールのコマンドは次のとおりです。

cl.exe /Fosmod.obj /c /I "%INCLUDE%" /I c:\python33\include smod.c link.exe /dll /out:smod.pyd smod.obj /LIBPATH:c:\python33\libs

これらにより、私のモジュールは PyObject_Print() でクラッシュしました!

「cl」コマンド ライン オプションをざっと読んで、「/MD」を追加しました。

cl.exe /MD /Fosmod.obj /c /I "%INCLUDE%" /I c:\python33\include smod.c link.exe /dll /out:smod.pyd smod.obj /LIBPATH:c:\python33 \libs

修理済み!

于 2013-10-29T17:21:28.893 に答える