从Python传入的环境在发布和调试模式下是不同的

时间:2013-05-09 17:13:29

标签: python visual-c++ bloomberg

我目前正在使用Visual Studios构建一个Python插件 2012年,生成64位代码。另外,我们正在使用 彭博图书馆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中有效 模式,但不在发布中:函数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后触发?可能是 以某种方式与加载地址相关?)

0 个答案:

没有答案