记一次Python 3.11.0的编译安装过程
此文章使用
CC-BY-NC协议,协议详情介绍请看此文
前言
一直觉得自己Ubuntu上的Python3.x版本较老, 于是今天心血来潮到Python官网看了一下最新的版本号.

最新稳定版是3.11.0, 而我的是3.10.6, 也没有差几个版本.

不过在我关闭网页之前, 打开了3.11.0版本的页面, 然后就看到了:

快了10%~60%! 虽然我一直没真正体会到Python的运行效果到底有多慢, 不过这个数字还是很让人兴奋的!
所以尝试从源代码编译安装Python 3.11.0. 并且尽量不使用搜索引擎.
使用系统: Ubuntu 22.04.1.
请务必先读全文再操作!
下载
点击这里到3.11.0版本的详情页面. 点击这里下载3.11.0版本的*.tar.gz压缩包.
下载到本地后右键解压即可.
配置
进入到Python-3.11.0文件夹, 进行编译一个标准项目的第一步: configure(配置).
这里谷歌了
configure的中文意思, 记录一下.
打开终端, 执行:
1 | ./configure |

md…居然一次性配置成功了…
为什么会这么说呢? 理论上这一步是会出错的(如果电脑中安装的依赖足够多则可能不会, 一次性成功是运气好).
在编译过程中, 如果出现了如xxx not found的报错, 就可以使用sudo apt install xxx来尝试解决. 若提示无法定位软件包, 这时就要上谷歌搜索一下了.
编译
在上一步无误的情况下, 输入指令:
1 | make |
配置那步大概会花费半分钟时间,
make需要更久.
遇到了一个错误:
1 | ModuleNotFoundError: No module named 'encodings' |
ModuleNotFoundError是很常见的Python模块报错, 意为没有安装此模块, 所以使用:
1 | pip install encodings |
再次报错:
1 | ERROR: Could not find a version that satisfies the requirement encodings (from versions: none) |
看来是没有这个模块了.
那么会不会是用户权限的问题呢? Python是Linux的基础软件包, 或许需要root权限?
以sudo再次运行配置和make, 依旧失败.
于是谷歌了第二次. 嘿嘿.
通过谷歌发现了cpython的 #94526, 里面说是路径编码的问题.

换到一个新文件夹, 这次路径中没有中文了.

那么这次, 以root身份再次执行上面的指令.
104秒, 编译成功!

安装
输入指令:
1 | sudo make install |
安装成功!

查看Python版本:
1 | python3 --version |
需要刷新一下:
1 | hash -r |

成功啦!
但是
当我尝试运行之前写过的Python程序时, 出现了缺少其他曾经安装过的依赖的报错.

很容易联想到是因为root用户的原因. 于是使用普通用户编译. 不过尝试用普通用户安装时报错权限不够(这也是必然的).

但以root身份安装后, 依旧报错. 普通用户编译+root用户安装的方法还是失败了:

实际上有一个方法, 就是以
sudo pip install xxx的方式再次安装一遍依赖. 但是当曾经的依赖安装得很多的时候, 这个方法不是很合适.
于是查看了模块的路径:

模块可以通过
sys.path查看.
发现问题了! 原来是两者的模块所在的路径不同!
手动安装的Python-3.11.0的模块, 路径在/usr/local/lib/python3.11/site-packages.
而通过apt安装的模块, 路径却在/usr/lib/python3/dist-packages
那么就可以执行指令:
1 | sudo ln -s /usr/lib/python3/dist-packages/* /usr/local/lib/python3.11/site-packages |
将所有原本的模块创建软链接到新的模块目录即可. 但需要注意, 此后所有的模块都需要root权限安装, 否则会将模块安装到原来的目录.
例如, 你本来是通过pip install requests安装的第三方包, 现在需要通过sudo pip install requests安装.
尝试运行之前的程序, 成功!
最后
重启电脑, 看看有没有什么问题.
等我!
重启完毕, 程序也运行正常!
那么总结一下:
1 | 0. 所有路径中不要有中文; |
即使/usr/local/lib/目录中有python3.10/dist-packages, 但不能在普通用户下被import使用.
可以尝试, 在未手动编译安装此版本之前, 进行
sudo pip install xxx, 会发现xxx被安装在python3.10/dist-packages, 而普通用户通过pip install xxx安装的xxx则在/usr/lib/python3/dist-packages/下.
这一点, 有点像npm与npm -g(也有点区别…).
我是听话的便当.

Bye~❛‿˂̵✧