C++ 包括 python.h 和 boost/python.hpp 导致 SEH 异常

Posted

技术标签:

【中文标题】C++ 包括 python.h 和 boost/python.hpp 导致 SEH 异常【英文标题】:C++ including python.h and boost/python.hpp causes SEH exception 【发布时间】:2015-02-06 15:47:27 【问题描述】:

我最近在尝试修复我正在开发的 c++ 软件中的 python 实现时偶然发现了一些东西。如果您包含以下内容:

#include <python.h>
#include <boost/python.hpp>

那么下面的代码会导致内存访问冲突的 SEH 异常:

boost::python::object mainModule;

Py_Initialize();

std::lock_guard<std::mutex> lg(PythonAccessMutex);
this->mainModule = boost::python::import("__main__");

boost::python::dict globalDict = boost::python::extract<boost::python::dict>(this->mainModule.attr("__dict__"));

删除 python.h 包含解决了我的问题,但我一直无法找出导致异常的原因,我希望能够与我的同事分享他们为什么不应该这样做(过去它破坏代码的明显原因)

我应该具体指出代码运行良好,直到它到达提取函数。

【问题讨论】:

【参考方案1】:

如果 Python.h 包含在 Boost.Python 标头之前,则会出现宏冲突。例如,Python.h 包含 LongObject.h 定义 ULONGLONG_MAX,这会混淆 Boost 的配置。包含问题在detail/prefix.hpp 中注明:

规则是&lt;Python.h&gt; 必须包含在任何系统头文件之前(这样它就可以控制一些糟糕的宏)。不幸的是,Boost.Python 需要首先#include &lt;limits.h&gt;,至少……但这让我们尽可能接近。

经过一些设置工作,detail/wrap_python.hpp 包含Python.h

【讨论】:

以上是关于C++ 包括 python.h 和 boost/python.hpp 导致 SEH 异常的主要内容,如果未能解决你的问题,请参考以下文章

Boost Python官方样例

Python 3.8:运行外部 C++ 代码:无法导入模块

当python使用“Python.h”调用该c++进程时,如何在python中停止一个c++进程

将 Python 添加到 C++:找不到 Python.h

使用 Python.h 未定义符号进行 C++ 编译

使用 Python.h 从 C++ 调用 Django