我目前正在使用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
后触发?可能是
以某种方式与加载地址相关?)