记一次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~❛‿˂̵✧