ImportError:无法从“matplotlib”导入名称“docstring”

tho*_*hor 6 python matplotlib importerror

最近,我的代码matplotlib.pyplot突然停止在我的所有机器(Ubuntu 22.04 LTS)上运行。我尝试了一个简单的方法import,但出现以下错误:

$ python
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.pyplot as plt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.10/dist-packages/matplotlib/pyplot.py", line 66, in <module>
    from matplotlib.figure import Figure, FigureBase, figaspect
  File "/usr/local/lib/python3.10/dist-packages/matplotlib/figure.py", line 43, in <module>
    from matplotlib import _blocking_input, backend_bases, _docstring, projections
  File "/usr/local/lib/python3.10/dist-packages/matplotlib/projections/__init__.py", line 58, in <module>
    from mpl_toolkits.mplot3d import Axes3D
  File "/usr/lib/python3/dist-packages/mpl_toolkits/mplot3d/__init__.py", line 1, in <module>
    from .axes3d import Axes3D
  File "/usr/lib/python3/dist-packages/mpl_toolkits/mplot3d/axes3d.py", line 23, in <module>
    from matplotlib import _api, cbook, docstring, _preprocess_data
ImportError: cannot import name 'docstring' from 'matplotlib' (/usr/local/lib/python3.10/dist-packages/matplotlib/__init__.py)
Run Code Online (Sandbox Code Playgroud)

我不确定是什么导致了问题,以及如何诊断或修复它。该matplotlib软件包是使用 pip 作为 root 进行安装的,因为我需要它默认对所有用户可用。

有没有人遇到过类似的问题并知道如何解决?

tho*_*hor 10

正如@Imsteffan 的评论以及链接的错误报告(此处此处)中所指出的,出现此问题的原因是:

... 文档字符串在 2 个版本的弃用周期后被删除,并更改为私有 (_docstring)

然而,mplot3d/axes3d.py 中出错的行已更新#22148,表明您正在获取的 mpl 版本 <3.6

我的操作系统就是这种情况。事实证明,apt 软件包python3-matplotlib也作为另一个软件包(qgis)的依赖项安装。所以 matplotlib 有两个版本,分别来自 pip 和 apt。

解决方案是删除两个版本之一。

在链接的错误报告中,建议删除 apt 版本:

sudo apt remove python3-matplotlib
Run Code Online (Sandbox Code Playgroud)

但就我而言,我无法删除依赖于 apt 版本的应用程序。所以我删除了 pip 版本。然后导入将按预期进行。

$ sudo pip uninstall matplotlib
Found existing installation: matplotlib 3.8.0
Uninstalling matplotlib-3.8.0:
  Would remove:
    /usr/local/lib/python3.10/dist-packages/matplotlib-3.8.0.dist-info/*
    /usr/local/lib/python3.10/dist-packages/matplotlib/*
    /usr/local/lib/python3.10/dist-packages/mpl_toolkits/axes_grid1/*
    /usr/local/lib/python3.10/dist-packages/mpl_toolkits/axisartist/*
    /usr/local/lib/python3.10/dist-packages/mpl_toolkits/mplot3d/*
    /usr/local/lib/python3.10/dist-packages/pylab.py
Proceed (Y/n)? 
  Successfully uninstalled matplotlib-3.8.0
Run Code Online (Sandbox Code Playgroud)