私は現在、Visual Studios 2012 を使用して Python プラグインを構築し、64 ビット コードを生成しています。さらに、Bloomberg ライブラリを使用していますblpapi
。プラグインをロードする Python モジュールでは、ロードする前に環境変数を設定します。コードは次のようになります。
import os
import imp
directory = os.path.dirname(os.path.realpath(__file__))
os.environ['__PYTHON_SYS_PATH_FOR_PROG__'] = directory
fp, pathname, description = imp.find_module('PyPROG', [ directory ])
if fp is not None:
try:
_mod = imp.load_module('PyPROG', fp, pathname, description)
finally:
fp.close()
PyPROG.pyd
パスにファイルがあり、通常は正常に動作します。import blpapi
ただし、以前は、デバッグモードでは機能しますが、リリースでは機能しません。関数は基本的に次のとおりinitPyPROG
です。
PyMODINIT_FUNC
initPyPROG()
{
try {
char const* syspath = getenv( "__PYTHON_SYS_PATH_FOR_PROG__" );
std::string path = syspath != NULL ? syspath : "";
bool verbose = getenv( "__PYTHON_PROG_VERBOSE__" ) != NULL;
if ( path.empty() ) {
// ...
}
// ...
} catch ( std::exception const& error ) {
PyErr_SetString( PyExc_ImportError, error.what() );
} catch ( ... ) {
if ( PyErr_Occurred() == NULL ) {
PyErr_SetString( PyExc_ImportError, "Unknown error initializing PyPROG" );
}
}
}
リリース モードでは、 をロードした後blpapi
、
path.empty()
ブランチに入ります。デバッグ モードではいいえ、ロードしない場合
blpapi
はいいえ。
プログラムのエントリにブレークポイントを設定し、デバッガーで環境を確認すると__PYTHON_SYS_PATH_FOR_PROG__
、エラーの場合には存在しません。これはデバッグ ビルドにあります。DllMain
また、dll がアタッチされたときに環境をファイルにダンプする関数
を追加すると、欠落している変数__PYTHON_SYS_PATH_FOR_PROG__
が唯一の違いになります。(現在は設定していません__PYTHON_PROG_VERBOSE__
。)
また、モジュールにコンストラクターを持つ静的変数はありません。(これは非常に小さなモジュールであり、実際の作業を行う他の DLL をロードするだけです。ただし、それほど遠くまではいきません。)
他の誰かが同様の問題を見たことがありますか? そして、どこから探し始めるべきですか?私のコードが実行される前にエラーが発生した場合: Visual Studio にバグはありますか? (しかし、もしそうなら、なぜロード後にのみトリガーするblpapi
のですか?何らかの方法でロードアドレスに関連している可能性がありますか?)