Python 3 软件包包含 Python 开发环境。它被用于面向对象编程,编写脚本,为大型程序建立原型,或者开发完整的应用。Python 是一种解释性的计算机语言。
准备编译 Python:
./configure --prefix=/usr \ --enable-shared \ --with-system-expat \ --enable-optimizations
配置选项的含义:
--with-system-expat
该选项允许链接到系统已经安装的 Expat。
--enable-optimizations
该选项启用有力,但是消耗时间的优化步骤。它会两次构建解释器;在初次构建结果上运行测试,并使用测试结果优化最终构建版本的性能。
编译该软件包:
make
已知一些测试偶尔会陷入无限等待状态。因此如果需要测试编译结果,运行测试套件,但是将每个单项测试的最长运行时间限制为 2 分钟:
make test TESTOPTS="--timeout 120"
对于较慢的系统,您可能需要放宽运行时间限制,1 SBU (通过仅用单个 CPU 核心构建第一遍的 Binutils 测得) 一般来说是足够的。一些测试并不精确,因此测试套件会自动重新运行失败的测试。如果某项测试失败后在重新运行时能够通过,则应该将其视为正常通过。已知一项名为 test_ssl 的测试在 chroot 环境中会失败。
安装该软件包:
make install
在本书中,我们以 root
用户身份,使用 pip3 命令,为所有用户安装 Python 3 程序和模块。这和
Python 开发者的建议不同:他们认为应该将这些包安装到虚拟环境中,或者某个用户的主目录中 (即,以该用户身份执行
pip3 命令)。只要使用
root
用户身份执行 pip3 命令,它就会输出若干行警告信息。
这项建议主要是为了避免和系统包管理器 (如 dpkg) 的冲突。LFS 没有系统包管理器,所以不存在这个问题。另外,pip3 在运行时,会检查它的最新版本。由于 LFS chroot 环境中没有配置域名解析,pip3 无法检查它的最新版本,也会输出一条警告信息。
在引导 LFS 系统并配置网络连接后,则会出现一条不同的警告信息,指示用户使用 PyPI 提供的,预先构建的 wheel 档案更新 pip3 (如果有更新的版本)。但是对于 LFS,我们认为 pip3 是 Python 3 的一部分,因此不应单独升级它。另外,使用预先构建的 wheel 包也会偏离我们的目标:从源代码构建 Linux 系统。因此,应该忽略关于 pip3 新版本的警告。如果您不想看到这些警告,可以执行以下命令,创建配置文件,以禁止这些警告:
cat > /etc/pip.conf << EOF
[global]
root-user-action = ignore
disable-pip-version-check = true
EOF
在 LFS 和 BLFS 中,我们通常用 pip3 命令构建和安装 Python
模块。请注意两份手册中的 pip3
install 命令都应该以 root
身份运行 (除非这条命令是为 Python 虚拟环境进行安装)。以非
root
用户身份运行 pip3 install
命令可能看似正常工作,但这会导致其他用户无法访问安装的模块。
pip3 install
不会自动重新安装已经安装好的模块。如果需要用 pip3
install 命令升级模块 (例如,从 meson-0.61.3 升级到
meson-0.62.0),则需要在命令行中加入 --upgrade
选项。如果由于某种原因,确实需要降级某个模块,或重新安装某个已安装的版本,需要在命令行中加入 --force-reinstall --no-deps
选项。
如果需要的话,安装预先格式化的文档:
install -v -dm755 /usr/share/doc/python-3.13.0/html tar --no-same-owner \ -xvf ../python-3.13.0-docs-html.tar.bz2 cp -R --no-preserve=mode python-3.13.0-docs-html/* \ /usr/share/doc/python-3.13.0/html
文档安装命令的含义:
--no-same-owner
(tar) 和 --no-preserve=mode
(cp)
保证安装的文件拥有正确的所有者和权限模式。在没有这些选项的时候,tar 会以上游开发者使用的用户作为所有者,且安装的文件会设有过于严格的权限模式。