1

我目前正在构建一个 Python 插件,使用 Visual Studios 2012,并生成 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之前,它在 Debug 模式下工作,而不是在 Release 模式下:该功能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 Studios 中是否存在错误?(但如果是这样,为什么它只在加载后触发blpapi?会不会与加载地址有某种关系?)

4

0 回答 0