11

Py_initialize / Py_Finalize が numpy で 2 回機能しないのと同様の問題に直面しています。Cでの基本的なコーディング:

Py_Initialize();
import_array();
//Call a python function which imports numpy as a module
//Py_Finalize()

プログラムはループ状態にあり、Python コードにインポートされたモジュールの 1 つとして numpy がある場合、セグ フォールトが発生します。numpy を削除すると、正常に動作します。

一時的な回避策として、私は Py_Finalize() を使用しないようにしましたが、[TOP からのメモリ使用量が増加し続けると観察される] 巨大なメモリ リークを引き起こしています。そして、私が投稿したリンクの提案を試しましたが、理解できませんでした。誰かが numpy などのインポートをしながら呼び出しを終了するための最良の方法を提案できますか?

ありがとうサントッシュ。

4

2 に答える 2

3

Py_initialize / Py_Finalize not working two with numpyに投稿されたソリューションを理解していないように見える方法がよくわかりません。投稿された解決策は非常に単純です。プログラムが実行されるたびに、Py_Initialize と Py_Finalize を 1 回だけ呼び出します。ループを実行するたびにそれらを呼び出さないでください。

あなたのプログラムは、起動時にいくつかの初期化コマンドを実行すると仮定します(一度だけ実行されます)。そこで Py_Initialize を呼び出します。二度と電話しないでください。また、プログラムが終了したときに、何かを破棄したり、ログ ファイルをダンプしたりするコードが含まれていると思います。そこで Py_Finalize を呼び出します。Py_Initialize と Py_Finalize は、Python インタープリターでのメモリ管理を支援するためのものではありません。プログラムがクラッシュする原因となるため、それらをその目的で使用しないでください。代わりに、Python 独自の関数を使用して、保持したくないオブジェクトを取り除きます。

コードを実行するたびに新しい環境を本当に作成しなければならない場合は、Py_NewInterpreter を使用してサブインタープリターを作成し、Py_EndInterpreter を使用して後でそのサブインタープリターを破棄できます。それらは、 Python C APIページの下部付近に文書化されています。これは、サブインタープリターが開始するたびにモジュールが再初期化されないことを除いて、新しいインタープリターを持つのと同様に機能します。

于 2013-02-13T04:13:25.170 に答える