You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pybind11嵌入Python解释器时二次导入Numpy模块导致程序崩溃的问题求助

Pybind11嵌入Python解释器时二次导入Numpy模块导致程序崩溃的问题求助

大家好,我目前正在QT的C++项目中使用pybind11嵌入Python脚本,前期功能都正常,但当我在Python脚本里导入numpy这类第三方扩展库时,遇到了棘手的问题。

我的代码示例

void myFuc()
{
    py::scoped_interpreter guard{};
    {
        py::exec(R"(
import numpy as np

foo = np.array([1,2,3])
print(foo)
)");
    }
}

这个myFunc()函数是通过QT程序里的按钮点击触发执行的。

问题现象

  • 第一次点击按钮:函数正常执行,控制台输出[1 2 3]
  • 第二次点击按钮:程序直接崩溃,抛出以下错误:
terminate called after throwing an instance of 'pybind11::error_already_set'
what():  SystemError: ../Objects/structseq.c:481: bad argument to internal function

At:
/home/user/.local/lib/python3.10/site-packages/numpy/core/overrides.py(6): <module>
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap_external>(883): exec_module
<frozen importlib._bootstrap>(703): _load_unlocked
<frozen importlib._bootstrap>(1006): _find_and_load_unlocked
<frozen importlib._bootstrap>(1027): _find_and_load
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap>(1079): _handle_fromlist
/home/user/.local/lib/python3.10/site-packages/numpy/core/multiarray.py(10): <module>
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap_external>(883): exec_module
<frozen importlib._bootstrap>(703): _load_unlocked
<frozen importlib._bootstrap>(1006): _find_and_load_unlocked
<frozen importlib._bootstrap>(1027): _find_and_load
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap>(1079): _handle_fromlist
/home/user/.local/lib/python3.10/site-packages/numpy/core/__init__.py(51): <module>
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap_external>(883): exec_module
<frozen importlib._bootstrap>(703): _load_unlocked
<frozen importlib._bootstrap>(1006): _find_and_load_unlocked
<frozen importlib._bootstrap>(1027): _find_and_load
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap>(1079): _handle_fromlist
/home/user/.local/lib/python3.10/site-packages/numpy/__init__.py(141): <module>
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap_external>(883): exec_module
<frozen importlib._bootstrap>(703): _load_unlocked
<frozen importlib._bootstrap>(1006): _find_and_load_unlocked
<frozen importlib._bootstrap>(1027): _find_and_load
<string>(5): <module>

我的猜测与尝试

我查阅了pybind11关于Python解释器生命周期的说明,猜测问题出在:部分Python第三方扩展库在解释器关闭后无法正确卸载,导致第二次初始化解释器时出现冲突。

我还找到了两个相关的问题案例:

  • 编号#3112的「第二次导入numpy模块失败」问题
  • 编号#1702的「无法两次运行导入PyQt5的脚本」问题

针对这些信息,我尝试了两种解决方案,但都没有效果:

  1. 替换py::scoped_interpreter guard{};为手动调用py::initialize_interpreter()和py::finalize_interpreter(),放在py::exec()的作用域前后,结果依旧报错;
  2. 尝试添加py::gil_scoped_acquire acquire;来保持解释器存活(不确定用法是否正确),但还是出现同样的崩溃错误。

我的环境信息

  • 操作系统:Ubuntu 22.04.1
  • Python版本:3.10
  • Numpy版本:1.24.3

希望有遇到过类似问题的朋友能帮忙指点一下,谢谢大家!

备注:内容来源于stack exchange,提问作者z5748259

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:50:30