python boost scope导致NoneType错误

Posted

技术标签:

【中文标题】python boost scope导致NoneType错误【英文标题】:python boost scope cause NoneType error 【发布时间】:2018-03-19 08:21:51 【问题描述】:

我编译了一个第三方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 错误,它是一个 cmake 错误?

【问题讨论】:

您必须根据站点指南提供 MCVE。此外,您的格式有点损坏。 @UlrichEckhardt 哪里坏了?所有格式看起来都很好。而且我正在尝试在没有提升的情况下重现它,如果我成功了,我将提供 MCVE。 第一段好像坏了。 好的,我已经添加了我拥有的所有信息。我的脚本无法重现它,这很混乱。 检查#define 中的BOOST_PYTHON_MODULE,我可以想象每个Python 模块只能使用一次。 【参考方案1】:

这个问题来自编译选项。 Cmake生成一个链接脚本,这个脚本使用libboost_python.a链接python模块alembicmodule.so。当我将libboost_python.a 更改为libboost_python.so 时,此问题已解决。

【讨论】:

以上是关于python boost scope导致NoneType错误的主要内容,如果未能解决你的问题,请参考以下文章

等效于 pybind11 中的 boost::python py::scope().attr()

提升 scoped_lock 导致 CPU 消耗过多

错误使用 scoped_lock 导致的内存泄漏?

boost::mutex::scoped_lock

使用 Boost::Python::Object 会导致链接器错误

C++ 中的 boost::scoped_ptr 和 STL