uv安装的cpython使用matplotlib库作图不能显示的问题起因和解决

uv安装的cpython使用matplotlib库作图不能显示,而系统自带的cpython却可以。

复制代码
aaa@kylin-pc:~/par$ mkdir uv3820
aaa@kylin-pc:~/par$ cd uv3820
aaa@kylin-pc:~/par/uv3820$ uv python install cpython-3.8.20
Installed Python 3.8.20 in 10.85s
 + cpython-3.8.20-linux-aarch64-gnu (python3.8)
aaa@kylin-pc:~/par/uv3820$ uv venv --python cpython-3.8.20
Using CPython 3.8.20
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
aaa@kylin-pc:~/par/uv3820$ source .venv/bin/activate
(uv3820) aaa@kylin-pc:~/par/uv3820$ uv pip install matplotlib
Resolved 13 packages in 2.09s
Prepared 9 packages in 1.35s
Installed 13 packages in 20ms
 + contourpy==1.1.1
 + cycler==0.12.1
 + fonttools==4.57.0
 + importlib-resources==6.4.5
 + kiwisolver==1.4.7
 + matplotlib==3.7.5
 + numpy==1.24.4
 + packaging==26.0
 + pillow==10.4.0
 + pyparsing==3.1.4
 + python-dateutil==2.9.0.post0
 + six==1.17.0
 + zipp==3.20.2
(uv3820) aaa@kylin-pc:~/par/uv3820$ python3
Python 3.8.20 (default, Oct  2 2024, 15:14:40) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> 
>>> xpoints = np.array([0, 6])
>>> ypoints = np.array([0, 60])
>>> 
>>> plt.plot(xpoints, ypoints)
[<matplotlib.lines.Line2D object at 0x7fa80671c0>]
>>> 
>>> plt.show()
<stdin>:1: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
>>> 

把这个cpython包单独下载下来,手工安装,也是一样的。

复制代码
aaa@kylin-pc:~/par/uv-aarch64-unknown-linux-musl$ ./uv python install cpython-3.8.20
error: Failed to install cpython-3.8.20-linux-aarch64-gnu
  Caused by: Request failed after 3 retries in 5.6s
  Caused by: Failed to download https://github.com/astral-sh/python-build-standalone/releases/download/20241002/cpython-3.8.20%2B20241002-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz
  Caused by: error sending request for url (https://github.com/astral-sh/python-build-standalone/releases/download/20241002/cpython-3.8.20%2B20241002-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz)
  Caused by: client error (Connect)
  Caused by: tunnel error: failed to create underlying connection
  Caused by: dns error
  Caused by: failed to lookup address information: Name does not resolve


aaa@kylin-pc:~/par$ wget -c https://github.com/astral-sh/python-build-standalone/releases/download/20241002/cpython-3.8.20%2B20241002-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz
aaa@kylin-pc:~/par$ mkdir tpy3820
aaa@kylin-pc:~/par$ cd tpy3820
aaa@kylin-pc:~/par/tpy3820$ /home/aaa/par/cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only_stripped/python/bin/python3.8 -m venv myenv
aaa@kylin-pc:~/par/tpy3820$ source myenv/bin/activate
(myenv) aaa@kylin-pc:~/par/tpy3820$ pip list
Package    Version
---------- -------
pip        23.0.1
setuptools 56.0.0
(myenv) aaa@kylin-pc:~/par/tpy3820$ python3 --version
Python 3.8.20
(myenv) aaa@kylin-pc:~/par/tpy3820$ pip  install --no-index -f ~/par/arm38 matplotlib
Looking in links: /home/aaa/par/arm38
Processing /home/aaa/par/arm38/matplotlib-3.7.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Processing /home/aaa/par/arm38/pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl
Processing /home/aaa/par/arm38/importlib_resources-6.4.5-py3-none-any.whl
Processing /home/aaa/par/arm38/numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Processing /home/aaa/par/arm38/kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Processing /home/aaa/par/arm38/packaging-26.0-py3-none-any.whl
Processing /home/aaa/par/arm38/contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Processing /home/aaa/par/arm38/pyparsing-3.1.4-py3-none-any.whl
Processing /home/aaa/par/arm38/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
Processing /home/aaa/par/arm38/fonttools-4.57.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Processing /home/aaa/par/arm38/cycler-0.12.1-py3-none-any.whl
Processing /home/aaa/par/arm38/zipp-3.20.2-py3-none-any.whl
Processing /home/aaa/par/arm38/six-1.17.0-py2.py3-none-any.whl
Installing collected packages: zipp, six, pyparsing, pillow, packaging, numpy, kiwisolver, fonttools, cycler, python-dateutil, importlib-resources, contourpy, matplotlib
Successfully installed contourpy-1.1.1 cycler-0.12.1 fonttools-4.57.0 importlib-resources-6.4.5 kiwisolver-1.4.7 matplotlib-3.7.5 numpy-1.24.4 packaging-26.0 pillow-10.4.0 pyparsing-3.1.4 python-dateutil-2.9.0.post0 six-1.17.0 zipp-3.20.2
(myenv) aaa@kylin-pc:~/par/tpy3820$ python3
Python 3.8.20 (default, Oct  2 2024, 15:14:40) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import matplotlib.pyplot as plt
>>> 
>>> import numpy as np
>>> 
>>> xpoints = np.array([0, 6])
>>> 
>>> ypoints = np.array([0, 60])
>>> 
>>> plt.plot(xpoints, ypoints)
[<matplotlib.lines.Line2D object at 0x7f823c5730>]
>>> 
>>> plt.show()
<stdin>:1: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.

将上述错误信息在网上搜索,

https://blog.csdn.net/qq_41073715/article/details/105033751 说agg是一个没有图形显示界面的终端,常用的有图形界面显示的终端有TkAgg等。用如下语句可以解决。

python 复制代码
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

但是没有解决。还是报错

python 复制代码
>>> import matplotlib
>>> print(matplotlib.get_backend())
agg
>>> matplotlib.use('TkAgg')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/aaa/par/cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/site-packages/matplotlib/__init__.py", line 1237, in use
    plt.switch_backend(name)
  File "/home/aaa/par/cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/site-packages/matplotlib/pyplot.py", line 271, in switch_backend
    backend_mod = importlib.import_module(
  File "/home/aaa/par/cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 843, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/aaa/par/cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/site-packages/matplotlib/backends/backend_tkagg.py", line 1, in <module>
    from . import _backend_tk
  File "/home/aaa/par/cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/site-packages/matplotlib/backends/_backend_tk.py", line 24, in <module>
    from . import _tkagg
ImportError: module '_tkinter' has no attribute '__file__'

再搜module '_tkinter' has no attribute '__file__'

原来是Matplotlib库的一个设计问题。有人已经发issue了:https://github.com/matplotlib/matplotlib/issues/23074

简单地说,uv的cpython静态链接了tk库,而Matplotlib按照动态库的文件名去找__file__,当然找不到,就报错了。

原帖下也没有具体解决方法,我试了更新版本,结果3.7.5已经是支持python 3.8的最新版了。

再回到问题本身,plt.plot()是成功的,只是plt.show()无法显示,那么把plt先保存到文件,然后显示文件就行了。

python 复制代码
>>> plt.plot(xpoints, ypoints)
[<matplotlib.lines.Line2D object at 0x7fab4707f0>]
>>> 
>>> plt.savefig('my_plot.png')
>>> from PIL import Image
>>> img = Image.open("my_plot.png")
>>> img.show()
>>> 日志记录文件:/home/aaa/.log/kylin-photo-viewer.log
相关推荐
threelab19 小时前
Three.js UV 图像变换效果 | 三维可视化 / AI 提示词
javascript·人工智能·uv
bwz999@88.com1 天前
python安装、使用uv
uv
一直会游泳的小猫3 天前
uv - 极速 Python 包管理器
python·工具·uv·包管理
爱吃巧克力的程序媛3 天前
计算机图形学---在OpenGL中,什么是归一化 UV 坐标?
人工智能·计算机视觉·uv
大江东去浪淘尽千古风流人物3 天前
【UV-SLAM】eLSD/LBD 数据维度 UV-SLAM吸收借鉴
数据库·线性代数·oracle·矩阵·uv·augmented reality
byzh_rc3 天前
[AI工具从入门到入土] 命令行
网络·人工智能·python·深度学习·matplotlib
程序员-小李4 天前
uv 学习总结:从零到一掌握现代化 Python 工具链
python·学习·uv
咯哦哦哦哦4 天前
Foundationpose环境配置【非conda--纯UV】(linux22.04+python3.10)
python·pip·uv
小何code4 天前
人工智能【第7篇】数据可视化:Matplotlib与Seaborn实战(万字长文+完整代码)
人工智能·机器学习·信息可视化·matplotlib
CG_MAGIC6 天前
幕后花絮:用Blender打造自己的建筑
3d·blender·贴图·uv·建模教程·渲云渲染