我编译了一个第三方python模块(alembic
),alembic通过PyImport_ImportModule
导入另一个python模块(imath
),imath通过PyImport_ImportModule
再次导入另一个python模块(iex
)。代码如下:
BOOST_PYTHON_MODULE(alembic)
{
handle<> imath(PyImport_ImportModule("imath"));
}
BOOST_PYTHON_MODULE(imath)
{
handle<> iex(PyImport_ImportModule("iex"));
}
BOOST_PYTHON_MODULE(iex)
{
scope().attr("BaseExc") = "An Exception";
}
如果我先导入imath,然后导入alembic,就可以了。但是如果我直接导入alembic,它将在scope().attr("BaseExc") = "An Exception"
处引发一个NoneType错误。我读过boost代码,我确信原因是detail::current_scope
是空的,但我不知道为什么。你知道吗
有人能帮我吗?为什么会这样?我怎么才能避免呢?你知道吗
添加:
我不能用上面的代码复制它。我写了一个cpp文件并用以下代码填充:
#include "boost/python.hpp"
using namespace boost::python;
BOOST_PYTHON_MODULE(alembic)
{
handle<> imath(PyImport_ImportModule("imath"));
}
然后使用此选项进行编译:
g++ -fPIC -shared -I/usr/include -L/usr/lib -lboost_python -lpython2.7 -L/usr/lib64 -Wl,-soname,alembicmodule.so -o alembicmodule.so alembic.cpp
而且效果很好。我很惊讶,因为在第三方模块中,错误发生在第一行。也许这不是一个boost bug,而是一个cmake bug?你知道吗
此问题来自编译选项。Cmake生成一个链接脚本,这个脚本使用
libboost_python.a
链接python模块alembicmodule.so
。当我把libboost_python.a
改为libboost_python.so
时,这个问题就解决了。你知道吗相关问题 更多 >
编程相关推荐