1. 前言
报错信息:ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found
是scipy的函数抛出来的
这个报错贯穿了我一整年的时间,因为package的版本不能降,去年找了很多方法都无法解决,不过既然服务器可以直接跑,就搁置了。但这次必须用到debug功能,不得不想办法彻底解决掉这个问题。
2. 解决过程
服务器是课题组的,我没有sudo权限,有的话更新一下系统lib目录下的gcc版本可能也就解决了,但现在只能去找别的方法。
观察报错发现很奇怪的一点,pycharm搜索的lib目录不是虚拟环境里的,而是系统里面的。我去自己的虚拟环境里搜索了一下发现是有这个29版本的,那现在的问题就变成了为什么pycharm不去读取虚拟环境中的lib里的运行库文件反而去读系统目录下面的,很明显大概率是环境变量的问题。但是一开始服务器的terminal运行程序也是会报这个错的,所以我在服务器里已经把虚拟环境的lib作为环境变量添加到了.bashrc文件里面,后面在terminal已经不会报错了,为什么修改环境变量对pycharm不起效呢?
后面改了一下搜索关键词,集中到pycharm内添加环境变量,找到了解决办法,具体可以参考这篇博客:pycharm远程连接服务器后添加多个LD_LIBRARY_PATH_pycharm运行时配置动态链接库路径-CSDN博客
简单来讲原因就是pycharm运行程序的时候根本不会加载.bashrc文件,这个文件应该只会在使用terminal登录服务器系统的时候才会初始化运行,所以在服务器添加的环境变量并不会起效,必须在pycharm里再添加才行。添加要在对应程序的configuration里修改,具体如下(适用于2023.2.3专业版):
(1)首先选择Edit Configurations
或者更简单的,从这里直接生成,这样可以直接忽略下面(2)和(3)里添加script和working directory的过程:
(2)打开后左上角加号新建一个配置,选python文件
(3)之后弹出这个界面,你可以修改一下这个运行配置的名字。
script是你要运行的.py文件的位置,script下面的一行是用来加给程序传入的参数的,服务器terminal里写的--x xx这种全复制过来就行
working directory是文件所在的目录
另外运行环境看一下是不是服务器上那个
然后就是重量级的环境变量了,lib目录就要添加在这里
添加页面就这样:
LD_LIBRARY_PATH
$LD_LIBRARY_PATH:/home/xxx(你自己的账号名)/anaconda3/envs/xxx(你自己的虚拟环境名)/lib
添加完之后就能正常运行了
后续的小插曲:用pycharm的debug功能检查完程序之后,就想用linux的nohup命令让程序挂在后台不断掉,这样就又需要回到terminal命令行运行程序。但此时再在服务器运行的话,一旦模型传到gpu之后开始运算系统就会报错:总线错误(核心已转储)。我一开始以为是显存不够才报错(之前疑似有过),但后面测试发现显存非常充足的情况下还是会在运行到相同位置时报错,而此时pycharm却可以正常运行程序(什么倒反天罡啊,笑死我了)。去搜了一下这个报错,信息非常少,但有些提到了可能是运行环境或者cuda版本不兼容之类的,也就是说和虚拟环境可能还是有关系。有了上面的经验之后我就先怀疑到了.bashrc文件上,而且回忆了一下问题的时间点好像就是我为了debug于是在服务器端尝试再次对.bashrc文件动手后才出现的,显得它更可疑了。后面检查了一下文件,真的发现了问题:
在文件末尾的conda初始化配置这里,判断语句中间赫然冒出来一个意义不明的“i”
估计是进insert模式输入的时候误写进去的,因为也没有标红之类的提示,一开始改文件的时候就没发现这里有问题,它的异常标注也就只是本应的黄色变成白色,也忒不明显了吧喂!
删掉了罪魁祸首,bug成功解决了。真是败是因为不加载.bashrc,成也是因为不加载.bashrc(乐)