导入glumpy时触发numpy.bool属性错误,修改代码后问题仍未解决
问题重现
我在激活clean-pvnet conda环境后执行import glumpy,触发了numpy的属性错误,完整报错信息如下:
>>> import glumpy /home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/gloo/variable.py:82: FutureWarning: In the future `np.bool` will be defined as the corresponding NumPy scalar. gl.GL_BOOL : ( 1, gl.GL_BOOL, np.bool), Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/__init__.py", line 7, in <module> from . import app File "/home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/app/__init__.py", line 23, in <module> from . console import Console File "/home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/app/console.py", line 7, in <module> from glumpy import gl, glm, gloo File "/home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/gloo/__init__.py", line 7, in <module> from . program import Program File "/home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/gloo/program.py", line 16, in <module> from . variable import gl_typeinfo, Uniform, Attribute File "/home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/gloo/variable.py", line 82, in <module> gl.GL_BOOL : ( 1, gl.GL_BOOL, np.bool), File "/home/mona/.local/lib/python3.10/site-packages/numpy/__init__.py", line 324, in __getattr__ raise AttributeError(__former_attrs__[attr]) AttributeError: module 'numpy' has no attribute 'bool'. `np.bool` was a deprecated alias for the builtin `bool`. To avoid this error in existing code, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here. The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
我尝试修改了/home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/gloo/variable.py文件第82行,把np.bool替换为np.bool_,但即使打开新终端重新激活环境,再次执行import glumpy还是会报同样的错误。
问题分析与解决方案
出现这种情况,大概率是以下几个原因之一,你可以按步骤排查:
1. 确认修改的是Python实际加载的glumpy文件
有时候我们可能找错了文件路径,Python实际加载的glumpy可能不在我们修改的目录下。你可以先在激活环境的终端中执行以下命令,确认glumpy的真实安装路径:
conda activate clean-pvnet python -c "import glumpy; print(glumpy.__file__)"
输出的路径就是glumpy的根目录,你需要修改这个路径下的gloo/variable.py文件,而不是凭记忆找的路径。
2. 检查glumpy中是否还有其他地方使用了np.bool
可能除了variable.py,glumpy的其他文件里也用到了np.bool,导致修改一处后仍然报错。你可以用搜索命令遍历整个glumpy目录,找出所有包含np.bool的文件:
grep -r "np.bool" /home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/
把搜索结果中所有出现np.bool的地方,全部替换为np.bool_。
3. 清理Python字节码缓存
Python会把编译后的.pyc文件和__pycache__目录缓存起来,即使你修改了.py文件,旧的缓存文件可能还在被加载。你可以手动删除glumpy目录下的所有__pycache__文件夹:
find /home/mona/anaconda3/envs/clean-pvnet/lib/python3.10/site-packages/glumpy/ -name "__pycache__" -type d -exec rm -r {} +
或者直接删除对应文件的.pyc版本(比如variable.pyc)。
4. 验证修改是否生效
完成以上步骤后,在终端中重新激活环境,执行以下命令测试:
conda activate clean-pvnet python -c "import numpy as np; from glumpy.gloo.variable import gl_typeinfo; print('修改成功,无报错')"
如果没有报错,说明修改已经生效,此时再执行import glumpy应该就能正常导入了。
备注:内容来源于stack exchange,提问作者Mona Jalal

