3

Pythonで書かれたアプリケーションがあります。

アプリケーションは、(ctypesを使用して)dll内のいくつかの関数を呼び出し、Python C APIからいくつかの関数を呼び出して、(異なる)pythonモジュール内のいくつかの関数をロードして実行します。これにより、WindowsError: exception: access violation reading 0x00000004一部のcoutデバッグでは、PythonCAPIの呼び出しでアクセス違反が発生することがわかります。

DLLがPythonモジュールを正常にロードし、スタンドアロンの.exeとしてテストすると完全に実行されることはわかっていますが、Pythonアプリケーションから実行すると、このアクセス違反エラーが発生します。

最初に、DLLでPy_NewInterpreterを使用して、これらのPythonモジュール関数を実行するための新しい個別のスペースを作成する必要があります。アプリケーションとモジュールがDLLによって実行されてデータを共有する必要がないため、これは便利なように思われます。 http://docs.python.org/2/c-api/init.html#Py_NewInterpreter

ただし、Py_NewInterpreterを使用した最初のテストでは、さらにエラーが発生してクラッシュするだけで失敗することがわかりました。

だから私の質問はこれをどのように実装する必要があります/PythonモジュールのDLLロードを機能させるために何をする必要がありますか?

4

1 に答える 1

1

これは、nullポインターを逆参照しているように見えます。つまり、構造体/クラスへのポインターがnullであり、オフセット4でサブオブジェクトを読み取っています。nullポインターを見逃さないように、コード全体にいくつかのassert()を振りかけます。Python C APIは、例外が発生した場合に定期的にnullを返すことにも注意してください。

そうは言っても、ctypesを介してDLLをインポートするPythonプログラムがあります。このDLLは、PythonのCAPIを介してPythonインタープリターを埋め込みます。右?私が間違っていなければ、それは事実上、1つのプロセスで2つのインタプリタインスタンスを提供します。問題は、グローバルオブジェクトが2つで共有されていることと、これが調整されていない可能性があることです。

私が試みるのは、ctypesを使用してDLLをインポートする代わりに、適切なPython(ラッパー)モジュールを作成することです。ただし、並行して行う別のことがあります。それは、Pythonユーザーのメーリングリストで、このセットアップが機能するかどうか、およびその理由を尋ねることです。あなたがそれを好む場合に備えて、ニュースゲートウェイもあります。

于 2013-01-25T19:36:35.523 に答える