python boost作用域cause NoneTyp

2024-10-01 04:54:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我编译了一个第三方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?你知道吗


Tags: 模块代码usralembicattrmodulescopehandle
1条回答
网友
1楼 · 发布于 2024-10-01 04:54:59

此问题来自编译选项。Cmake生成一个链接脚本,这个脚本使用libboost_python.a链接python模块alembicmodule.so。当我把libboost_python.a改为libboost_python.so时,这个问题就解决了。你知道吗

相关问题 更多 >