pyenv创建Python3.7虚拟环境后控制台导入模块触发段错误求助
问题原因
这个段错误是Pyenv安装的Python 3.7.0与Arch系统自带的GCC 11编译不兼容导致的:
- Python 3.7.0是2018年发布的早期版本,没有适配高版本GCC的编译规则,用GCC 11编译后会出现ctypes模块初始化的底层bug,Torch导入时会调用ctypes相关逻辑,刚好触发段错误。
- Jupyter内核可以正常导入的原因是IPython内核启动时会预先加载系统共享库,绕开了ctypes初始化的异常触发路径,不属于依赖版本适配问题。
- 全局Python 3.10无异常是因为3.10版本已经完整适配了高版本GCC的编译规则,不存在该底层bug。
解决方案
方案1(推荐):升级到Python 3.7最新维护版本
Python 3.7的后续小版本已经修复了高版本GCC的编译兼容性问题,操作如下:
- 卸载当前存在问题的Python 3.7.0版本:
pyenv uninstall 3.7.0
- 安装Python 3.7最新维护版(推荐3.7.16),编译时添加共享库参数避免后续加载问题:
PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.16
- 基于新安装的Python 3.7.16重新创建虚拟环境,重新安装Pandas、Torch等依赖即可。
方案2:临时绕开(适合必须保留Python 3.7.0的场景)
启动Python前预加载系统的libgomp共享库即可规避冲突,命令如下:
LD_PRELOAD=/usr/lib/libgomp.so.1 python
你可以在Shell配置文件(如/.bashrc、/.zshrc)中添加别名简化操作:
alias py37='LD_PRELOAD=/usr/lib/libgomp.so.1 python'
后续执行py37即可直接启动无段错误的Python 3.7.0环境。
方案3:排查环境变量冲突
如果上述方案无效,可以对比终端和Jupyter内核的环境变量差异:
- 激活虚拟环境后在终端执行:
echo $PYTHONPATH echo $LD_LIBRARY_PATH
- 在Jupyter notebook中执行相同的打印命令,删除终端环境变量中多余的、指向其他Python版本的路径即可解决冲突。
内容的提问来源于stack exchange,提问作者Cbhihe
相关产品推荐
相关产品推荐

