1

私は現在、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" );
        }
    }
}

リリース モードでは、 をロードした後blpapipath.empty()ブランチに入ります。デバッグ モードではいいえ、ロードしない場合 blpapiはいいえ。

プログラムのエントリにブレークポイントを設定し、デバッガーで環境を確認すると__PYTHON_SYS_PATH_FOR_PROG__ 、エラーの場合には存在しません。これはデバッグ ビルドにあります。DllMainまた、dll がアタッチされたときに環境をファイルにダンプする関数 を追加すると、欠落している変数__PYTHON_SYS_PATH_FOR_PROG__が唯一の違いになります。(現在は設定していません__PYTHON_PROG_VERBOSE__。)

また、モジュールにコンストラクターを持つ静的変数はありません。(これは非常に小さなモジュールであり、実際の作業を行う他の DLL をロードするだけです。ただし、それほど遠くまではいきません。)

他の誰かが同様の問題を見たことがありますか? そして、どこから探し始めるべきですか?私のコードが実行される前にエラーが発生した場合: Visual Studio にバグはありますか? (しかし、もしそうなら、なぜロード後にのみトリガーするblpapiのですか?何らかの方法でロードアドレスに関連している可能性がありますか?)

4

0 に答える 0