我目前正在构建一个 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
?会不会与加载地址有某种关系?)