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的脚本」问题
针对这些信息,我尝试了两种解决方案,但都没有效果:
- 替换
py::scoped_interpreter guard{};为手动调用py::initialize_interpreter()和py::finalize_interpreter(),放在py::exec()的作用域前后,结果依旧报错; - 尝试添加
py::gil_scoped_acquire acquire;来保持解释器存活(不确定用法是否正确),但还是出现同样的崩溃错误。
我的环境信息
- 操作系统:Ubuntu 22.04.1
- Python版本:3.10
- Numpy版本:1.24.3
希望有遇到过类似问题的朋友能帮忙指点一下,谢谢大家!
备注:内容来源于stack exchange,提问作者z5748259
相关产品推荐
相关产品推荐

