3

これは既知の問題ですが、専門家に解決する最善の方法を尋ねたいと思います。

Python をスクリプト言語として実行するプロジェクト (Euler Math Toolbox) があります。このために、実行時にライブラリ モジュール「python.dll」がロードされ、「python27.lib」にリンクされます。次に、Py_Initialize が呼び出されます。これはすべてうまくいきます。

ただし、オイラーは、ユーザーが新しいセッションとノートブックを使用して再起動できます。次に、Python にすべての変数とインポートをクリアしてもらいます。このために、Py_Finalize を呼び出して "python.dll" をアンロードします。Python が必要な場合、読み込みと初期化により Python が再び起動します。

これは機能します。ただし、MatPlotlib が前のセッションでインポートされている場合、Python は最初の呼び出しでクラッシュします。Py_Finalize は Python を完全にクリアしていないようで、「python.dll」をアンロードしていないようです。"python27.dll" (Python DLL) をアンロードしようとしましたが、これは役に立ちません。ほとんどの場合、別の DLL がアクティブなままですが、Py_Finalize 中に破損します。

これを解決するには、すべての変数とインポートをクリアするだけで十分です。Py_Finalize を呼び出さなくても大丈夫です。しかし、どのように?

PS: なぜ euler.exe を Python に直接リンクしないのか不思議に思うかもしれません。その理由は、Python がインストールされていない場合、たとえ必要がなくても、オイラー形式が開始されないからです。

回答ありがとうございます。必要に応じて、gmail で renegrothmann への回答を複製します。それは私を助けるでしょう。

4

1 に答える 1

1

これを解決するには、すべての変数とインポートをクリアするだけで十分です。Py_Finalize を呼び出さなくても大丈夫です。しかし、どのように?

各呼び出しの後にすべての参照を適切に解放すれば、これはうまくいくはずです。呼び出しPy_Initializeは 1 回だけにして、絶対に呼び出してはいけませんPy_Finalize。個別の辞書を使用して各「セッション」を実行し、参照カウントが終了したら常に適切にデクリメントします (コードの実行後にこれらの変数を解放します)。

余談ですが、これはよくある問題です。numpy などの他の多くのパッケージ、または Boost::Python を使用して作成されたパッケージは、 を使用すると同じ動作を示しますPy_Finalize

于 2013-05-27T20:12:11.010 に答える