2011-09-24 19 views
5

私はPython埋め込みの新機能です。 私はPython + numpyコードをC++コールバック関数(dllの中に)に埋め込もうとしていますPython + numpyコードをC++ dllコールバックに埋め込む

私が直面している問題は以下の通りです。私が持っている場合:

Py_Initialize(); 
// some python glue 
// python invocation 
Py_Finalize(); 

すべてがうまくいきます。

私がある場合:

Py_Initialize(); 
_import_array(); //to initialize numpy C-API 
// some python glue + numpy array object creation 
// python invocation via PyObject_CallObject() 
Py_Finalize(); 

これは、それが(_import_arrayに到達する第2の時間にクラッシュ)。私が代わりに(したがってたびに初期化しない/ファイナライズ)デストラクタでPythonとnumpyの初期化は一度だけとファイナライズを行う場合は、コールバックを離れるとき

..すべてのクラッシュを

を(それが最初のコールバックのために働くことを意味します)

私は推測するここでの問題はnumpyのですが、私はあなたの.dllにかかわらず、コードが実際に呼び出された回数の、いったんのみ初期化されていることを確認してみ

+0

あなたは完全にDLLが構築される方法を制御することができる場合、私はperonallyのdistutilsとSWIGに詳細を残すでしょう。ここにプロジェクトの例(numpyとのインタフェース)があります:https://github.com/martinxyz/python/tree/master/realistic – maxy

答えて

1

にそれを解決する方法を知りません。ここで

は「DLLでC++シングルトン」のリンクです:

Singleton in a DLL?

+0

こんにちはポール、あなたの答えをありがとう! 私はdllが初期化されていることを確かめています。実際には、私のdllの初期化時にPythonを初期化してデストラクタでファイナライズしても、これはうまく動作します。 ' \ n "' '"からの時刻インポート時間\ n "' ''からnumpyインポート* \ n "' '' print '今日は'、ctime(時間))\ n "' \t ' ; PyObject_CallObject()でPythonを呼び出そうとすると、それ以上は動作せず、コールバックが終了するとクラッシュします。 –

+1

こんにちは1)プログラムの実行中に一度だけPythonを初期化してください1回以上、そうでなければ決して)。 2)上記のmartinxyzサンプルコードを見てください。3)このスレッドを見てください - 同様の問題です。参照カウントエラーが原因です:http://www.velocityreviews.com/forums/t566237-pyobject_callobject-code-dump-after -calling-4-times.html – paulsm4

+0

ありがとうポール、このリンクは多くの助けになりました!実際問題は、PyTuple_SetItem()で使用されるオブジェクトのDECREFでした。今はうまくいくようですが、もっと広範なテストをする必要があります。 もう一度おねがいします! –

関連する問題