AttributeError: module ‘matplotlib.cbook‘ has no attribute ‘iterable‘及同类型报错问题的一般解决思路与注意事项

28 篇文章 5 订阅

1 报错内容

  凡是报错信息为AttributeError: 'xxxx' object has no attribute 'yyyy'的,都可以考虑一下是因为该库版本与所使用代码不匹配造成的。通常是版本太低造成的,比如在后续更新过程中,该方法被改变了,所以再使用以前的方法名,就会报错找不到该方法了。比如,我在使用matplotlib库的时候,报错如下:

Traceback (most recent call last):
  File "layout_examples.py", line 71, in <module>
    plot_graph_2d(g, (5, 5), plot_terminals=False)
  File "/home/xxx/yyy/graphcut/PyMaxflow/examples/examples_utils.py", line 21, in plot_graph_2d
    nx.draw(nxgraph, pos=positions)
  File "/home/xxx/anaconda3/envs/zzz/lib/python3.8/site-packages/networkx/drawing/nx_pylab.py", line 126, in draw
    draw_networkx(G, pos=pos, ax=ax, **kwds)
  File "/home/xxx/anaconda3/envs/zzz/lib/python3.8/site-packages/networkx/drawing/nx_pylab.py", line 269, in draw_networkx
    edge_collection = draw_networkx_edges(G, pos, arrows=arrows, **kwds)
  File "/home/xxx/anaconda3/envs/zzz/lib/python3.8/site-packages/networkx/drawing/nx_pylab.py", line 518, in draw_networkx_edges
    if not cb.iterable(width):
AttributeError: module 'matplotlib.cbook' has no attribute 'iterable'

  

2 解决方法

  知道了报错原因,我们的解决方法也就很显而易见了。最简单的就是,将已经安装的出错的库卸载掉,然后重新安装更低(或更高)版本的即可。
首先,运行如下命令,查看一下已安装的matplotlib的版本:

conda list

在这里插入图片描述
  可以看到,版本是3.4.3。我们可以直接去该库的官网上,查看当前最新版本和历史版本,网址:https://pypi.org/project/matplotlib/3.6.1/#history。可以看到,当前最新版本是3.6.1,更新于2022.10.8。
在这里插入图片描述  但是旧版本有那么多,我该如何确定我需要安装哪个版本呢?虽然是因为当前所使用的库太新了所导致的这个问题,但是也不是说我安装的越旧越好(容易出错,可以见下文注意事项3.1所述)。我们可以通过所使用代码的修改时间来进行大致确定。也就是说,比如我现在要跑的这个代码,是作者2020年那会儿公开的,那么,我就可以找一下matplotlib在2020年左右时候的版本号。这里,我就使用了3.1.0版本的,发布于2019.5.19。那么,安装命令如下:

pip install matplotlib==3.1.0

  安装成功后,再去运行代码。如果还是报同样错误的话,那么可以考虑再重新安装更低一些的版本。
  

3 注意事项

3.1 安装时报错

  因为一开始我也是直接百度了这个错误,然后就看到有一篇博客说安装2.2.3版本的就好了。于是我就直接卸载,然后安装了2.2.3版本的,结果安装过程中报错了,如下:
在这里插入图片描述  是一个很长的错误,下面还有很多内容。具体报这个错误的原因,我们这里就不深究了,我猜测可能是库之间的版本冲突、该版本太老了等原因。从官网上可以看到,2.2.3版本是2018.8.12发布的,距今还是有一些年头了。所以也就回到上面说到的,并不是库的版本越低越好,最重要的是“合适”。当然,安装上面说的3.1.0版本是不会报错的,我已经安装成功了。
  

3.2 注意环境污染问题

  我们在对当前环境下的库版本进行修改的时候,需要考虑一下对它进行的修改是否会影响到其他代码在该环境下的运行。这里需要分两种情况:

  1. 报错的库只有当前代码用到了,甚至是在运行当前代码的时候才安装的。那么,对它的版本进行升级或者降级,通常并不会对其他库或者其他代码使用该环境造成影响,可以较为放心地修改它的版本。
  2. 报错的库在更早之前就已经被安装了,其他代码也需要依赖该库。那么,对该库的版本进行修改,就有可能对别的代码造成影响了。这种情况也不是说就别修改该库版本了,其实只要在修改之前,我们先将当前版本记录下来,然后在后续如果运行其他代码发现该库报错了,那么可以再将其版本修改回去。当然,这样可能有点麻烦,难道我跑不同代码,还要每次卸载安装库吗。所以一个更合适的解决方案是,新建一个环境来安装所需版本的库。但是这样其实也有一点儿麻烦,所以要采取什么方案,还需要自己根据实际情况来进行定夺。
      
3.3 版本升级

  上面我们说到的是版本太新了,需要进行降级。而有些情况下,也可能是因为库的版本太旧了。好在使用pip卸载和安装库很方便,所以在针对具体问题的时候,我们可以多尝试不同的版本,从而找到一个合适的匹配。总之,记住以下卸载和安装指定版本库的命令即可:

# 卸载
pip uninstall matplotlib
# 安装
pip install matplotlib==3.1.0
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zeeq_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值