记一次Python 3.11.0的编译安装过程

本文最后更新于:3 个月前

点击获得封面头图

此文章使用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
2
3
4
5
6
7
ModuleNotFoundError: No module named 'encodings'
Fatal Python error: error evaluating path
Python runtime state: core initialized

Current thread 0x00007fdb33ac2740 (most recent call first):
<no Python frame>
make: *** [Makefile:1207:Python/frozen_modules/abc.h] 错误 1

ModuleNotFoundError是很常见的Python模块报错, 意为没有安装此模块, 所以使用:

1
pip install encodings

再次报错:

1
2
ERROR: Could not find a version that satisfies the requirement encodings (from versions: none)
ERROR: No matching distribution found for encodings

看来是没有这个模块了.

那么会不会是用户权限的问题呢? Python是Linux的基础软件包, 或许需要root权限?

sudo再次运行配置make, 依旧失败.

于是谷歌了第二次. 嘿嘿.

通过谷歌发现了cpython的 #94526, 里面说是路径编码的问题.

md, 确实是有中文路径了...

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

如图所示

那么这次, 以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
2
3
4
5
6
7
0. 所有路径中不要有中文;

1. 配置, 编译时, 无论是普通用户或是root用户都可;

2. 第三方包通过`sudo ln -s /usr/lib/python3/dist-packages/* /usr/local/lib/python3.11/site-packages`迁移;

3. 以后的第三方包通过`sudo pip install xxx`安装.

即使/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/下.

这一点, 有点像npmnpm -g(也有点区别…).


我是听话的便当.

Bye~❛‿˂̵✧