如何在 Debian 9.8 上从源代码构建和安装 Python 3.7.x

如何在 Debian 9.8 上从源代码构建和安装 Python 3.7.x

我全新安装了 Debian 9.8,这是当前的稳定发布版本。

$ lsb_release --description
Description:    Debian GNU/Linux 9.8 (stretch)

本系统包含Python 3.5.3:

$ python3 --version
Python 3.5.3

不幸的是,该版本不符合我的需求。我想要一个更新的 Python 版本。在撰写本文时,当前版本是 3.7.2。

希望这对一系列版本都有帮助,但为了将范围限制在我们可以非常精确的范围内,这个问题是关于上述操作系统和 python 版本的组合。

进一步说明:我想使用默认配置从 python git 源代码存储库构建:我们将./configure不带任何参数运行,除非可能--prefix选择自定义安装位置。如果可能,我希望任何所需的依赖项都来自标准 Debian apt 源。

最后也是最重要的一点:对于我们作为先决条件安装的任何附加软件,请提供一些相关信息。不要只是说“安装这个难以理解的 apt 软件包列表”。

对于 Debian 的 stretch 存储库中可用的任何依赖项,我需要以下信息:

  • 该依赖项是否可以被视为可选的,或者是否必须被视为必需的,以便成功完成 python 的构建/安装步骤。

  • apt 包来源的项目主页链接(如果没有合适的主页,则为下一个最佳主页,例如 repo url)。

  • 依赖项映射到最终安装中的哪个功能/模块?有时这很明显,因为项目名称、包名称和用于构建的模块之间的名称相似或相同,但有时却不明显。

有了这些信息,任何阅读本文的人都可以了解他们正在安装什么以及为什么安装。确定项目需要哪些依赖项的任务有望变得更容易。

答案1

安装 git

$ sudo apt install git

安装 Python 构建依赖项

Python 包含一组通过链接到其他流行的开源项目而构建的模块。许多此类项目默认作为可执行程序包含在 Debian 中,但链接到 Python 所需的开发文件(标头、库)是单独打包的,并不包含在默认的 Debian 安装中。

其中一些库实际上是 Python 构建/安装步骤成功完成所必需的:

| Library                            | Python Module | Dev Package  |
| ---------------------------------- | ------------- | ------------ |
| https://www.zlib.net/              | `zlib`        | `zlib1g-dev` |
| https://www.sourceware.org/libffi/ | `_ctypes`     | `libffi-dev` |

“Dev Package”列中的条目是包含我们的python构建所需的开发文件的包的名称。

这些“dev”包中的每一个都有一个对应的二进制包,该二进制包可能已经安装。因此,您可能不会通过安装这些包向系统添加新软件。您只是安装了编译新软件(在我们的例子中是较新的 Python)所需的文件,以便可以使用它们。(另请注意,这些“dev”包都有其对应的二进制包作为依赖项,因此安装 dev 包将确保其二进制包也已安装。)

因此让我们安装它们:

sudo apt install zlib1g-dev libffi-dev

https接下来我们有 OpenSSL 库。Python 认为 OpenSSL 是可选的,但您可能需要它。例如,如果缺少 SSL/TLS 支持,即使使用 Python 的包安装工具在获取 URL 时也会遇到麻烦。

| Library                  | Python Module | Dev Package |
| ------------------------ | ------------- | ----------- |
| https://www.openssl.org/ | `_ssl`        | `libssl-dev |

让我们安装它:

sudo apt install libssl-dev

下一组包更属于“可选”类别:

| Library                                              | Python Module(s)              | Dev Package        |
| ---------------------------------------------------- | ----------------------------- | ------------------ |
| http://www.bzip.org/                                 | `_bz2`                        | `libbz2-dev`       |
| https://www.gnu.org/software/ncurses/                | `_curses` and `_curses_panel` | `libncursesw5-dev` |
| https://www.gnu.org.ua/software/gdbm/                | `_dbm` and `_gdbm`            | `libgdbm-dev`      |
| https://tukaani.org/xz/                              | `_lzma`                       | `liblzma-dev`      |
| https://www.sqlite.org/                              | `_sqlite3`                    | `libsqlite3-dev`   |
| https://www.tcl.tk/software/tcltk/                   | `_tkinter`                    | `tk-dev`           |
| https://github.com/karelzak/util-linux               | `_uuid`                       | `uuid-dev`         |
| https://tiswww.case.edu/php/chet/readline/rltop.html | `readline`                    | `libreadline-dev`  |

Python 无需这些即可构建和安装,您的应用程序可能不需要它们。另一方面,如果您安装它们,则“make”步骤不应报告无法构建的任何模块,并且二进制文件已包含在默认 Debian 安装中。

如果您想继续并安装上述所有“可选”软件包,请复制粘贴以下命令:

sudo apt install libbz2-dev libncursesw5-dev libgdbm-dev liblzma-dev libsqlite3-dev tk-dev uuid-dev libreadline-dev

从源代码构建并安装 python

  1. 克隆 python git 存储库。
$ git clone [email protected]:python/cpython.git
Cloning into 'cpython'...
[...]
Resolving deltas: 100% (592215/592215), done.
  1. 使用 git 标签名称检出您想要安装的版本(在本例中为 3.7.2)。
$ cd cpython/
cpython$ git checkout v3.7.2
Note: checking out 'v3.7.2'.
[...]
HEAD is now at 9a3ffc0492... 3.7.2final
cpython$
  1. 选择安装前缀。即编译和链接的项目将安装到的路径。在本例中,我将使用$HOME/python/v3.7.2。我包括版本号,因为我想在将来安装其他版本,并将它们分开。使用configure此路径作为--prefix参数运行脚本。(如果您不提供 --prefix 参数,它将默认为/usr/local)。
cpython$ ./configure --prefix=$HOME/python/v3.7.2
[...]
checking for inflateCopy in -lz... yes
[...]
checking for openssl/ssl.h in /usr... yes
[...]

configure脚本将检查很多内容,其中许多内容都是不必要的。不过,上面输出中显示的那些内容可以视为必需的。

  1. 通过运行来构建 Python make。如果我们包含了构建和安装 Python 所需的最小依赖项集,则输出将在最后告诉您哪些模块未构建:
cpython$ make
[...]
Python build finished successfully!
The necessary bits to build these optional modules were not found:
_bz2                  _curses               _curses_panel      
_dbm                  _gdbm                 _lzma              
_sqlite3              _tkinter              _uuid              
readline                                                       
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

输出make将其描述为“可选”模块列表,但至少对于这个特定版本的python,如果没有zlib、和_ctypes模块,它可能无法成功构建和安装。

  1. 通过运行 安装 python make install。我们已经在configure步骤中提供了安装位置。如果您的安装位置是根目录(例如/usr/local),请在此命令前加上前缀sudo。由于在本例中我要安装到用户目录,所以我不想这样做。
cpython$ make install
Creating directory /home/python/v3.7.2/bin
Creating directory /home/python/v3.7.2/lib
[...]

  1. 现在您应该有一个可执行文件,可以从bin名为 的安装前缀下的目录中运行python3。(请注意,此安装程序不会在 处放置任何内容bin/python;只是bin/python3。)
$ $HOME/python/v3.7.2/bin/python3
Python 3.7.2 (v3.7.2:9a3ffc0492, Mar 10 2019, 19:35:56) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
$

相关内容