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

张开发
2026/4/14 21:11:25 15 分钟阅读

分享文章

uv安装的cpython使用matplotlib库作图不能显示的问题起因和解决
uv安装的cpython使用matplotlib库作图不能显示而系统自带的cpython却可以。aaakylin-pc:~/par$ mkdir uv3820 aaakylin-pc:~/par$ cd uv3820 aaakylin-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) aaakylin-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 aaakylin-pc:~/par/uv3820$ source .venv/bin/activate (uv3820) aaakylin-pc:~/par/uv3820$ uv pip install matplotlib Resolved 13 packages in 2.09s Prepared 9 packages in 1.35s Installed 13 packages in 20ms contourpy1.1.1 cycler0.12.1 fonttools4.57.0 importlib-resources6.4.5 kiwisolver1.4.7 matplotlib3.7.5 numpy1.24.4 packaging26.0 pillow10.4.0 pyparsing3.1.4 python-dateutil2.9.0.post0 six1.17.0 zipp3.20.2 (uv3820) aaakylin-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包单独下载下来手工安装也是一样的。aaakylin-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 aaakylin-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 aaakylin-pc:~/par$ mkdir tpy3820 aaakylin-pc:~/par$ cd tpy3820 aaakylin-pc:~/par/tpy3820$ /home/aaa/par/cpython-3.8.2020241002-aarch64-unknown-linux-gnu-install_only_stripped/python/bin/python3.8 -m venv myenv aaakylin-pc:~/par/tpy3820$ source myenv/bin/activate (myenv) aaakylin-pc:~/par/tpy3820$ pip list Package Version ---------- ------- pip 23.0.1 setuptools 56.0.0 (myenv) aaakylin-pc:~/par/tpy3820$ python3 --version Python 3.8.20 (myenv) aaakylin-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) aaakylin-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等。用如下语句可以解决。importmatplotlib matplotlib.use(TkAgg)importmatplotlib.pyplotasplt但是没有解决。还是报错importmatplotlibprint(matplotlib.get_backend())aggmatplotlib.use(TkAgg)Traceback(most recent call last):Filestdin,line1,inmoduleFile/home/aaa/par/cpython-3.8.2020241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/site-packages/matplotlib/__init__.py,line1237,inuse plt.switch_backend(name)File/home/aaa/par/cpython-3.8.2020241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/site-packages/matplotlib/pyplot.py,line271,inswitch_backend backend_modimportlib.import_module(File/home/aaa/par/cpython-3.8.2020241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/importlib/__init__.py,line127,inimport_modulereturn_bootstrap._gcd_import(name[level:],package,level)Filefrozen importlib._bootstrap,line1014,in_gcd_import Filefrozen importlib._bootstrap,line991,in_find_and_load Filefrozen importlib._bootstrap,line975,in_find_and_load_unlocked Filefrozen importlib._bootstrap,line671,in_load_unlocked Filefrozen importlib._bootstrap_external,line843,inexec_module Filefrozen importlib._bootstrap,line219,in_call_with_frames_removed File/home/aaa/par/cpython-3.8.2020241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/site-packages/matplotlib/backends/backend_tkagg.py,line1,inmodulefrom.import_backend_tk File/home/aaa/par/cpython-3.8.2020241002-aarch64-unknown-linux-gnu-install_only_stripped/python/lib/python3.8/site-packages/matplotlib/backends/_backend_tk.py,line24,inmodulefrom.import_tkagg ImportError:module_tkinterhas 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先保存到文件然后显示文件就行了。plt.plot(xpoints,ypoints)[matplotlib.lines.Line2Dobjectat0x7fab4707f0]plt.savefig(my_plot.png)fromPILimportImageimgImage.open(my_plot.png)img.show()日志记录文件/home/aaa/.log/kylin-photo-viewer.log

更多文章