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

Cha*_*lie 17 debian python

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

$ lsb_release --description
Description:    Debian GNU/Linux 9.8 (stretch)
Run Code Online (Sandbox Code Playgroud)

本系统包含 Python 3.5.3:

$ python3 --version
Python 3.5.3
Run Code Online (Sandbox Code Playgroud)

不幸的是,那个版本不能满足我的需要。我想要一个更新版本的 Python。在撰写本文时,当前版本为 3.7.2。

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

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

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

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

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

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

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

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

Cha*_*lie 33

安装 git

$ sudo apt install git
Run Code Online (Sandbox Code Playgroud)

安装 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` |
Run Code Online (Sandbox Code Playgroud)

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

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

所以让我们安装它们:

sudo apt install zlib1g-dev libffi-dev
Run Code Online (Sandbox Code Playgroud)

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

| Library                  | Python Module | Dev Package |
| ------------------------ | ------------- | ----------- |
| https://www.openssl.org/ | `_ssl`        | `libssl-dev |
Run Code Online (Sandbox Code Playgroud)

让我们安装它:

sudo apt install libssl-dev
Run Code Online (Sandbox Code Playgroud)

下一组软件包更多地属于“可选”类别:

| 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`  |
Run Code Online (Sandbox Code Playgroud)

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

如果您想继续安装上述所有“可选”软件包,则复制粘贴的命令是:

sudo apt install libbz2-dev libncursesw5-dev libgdbm-dev liblzma-dev libsqlite3-dev tk-dev uuid-dev libreadline-dev
Run Code Online (Sandbox Code Playgroud)

从源代码构建和安装 python

  1. 克隆 python git 存储库。
$ git clone git@github.com:python/cpython.git
Cloning into 'cpython'...
[...]
Resolving deltas: 100% (592215/592215), done.
Run Code Online (Sandbox Code Playgroud)
  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$
Run Code Online (Sandbox Code Playgroud)
  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
[...]
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

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
[...]

Run Code Online (Sandbox Code Playgroud)
  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()
$
Run Code Online (Sandbox Code Playgroud)

  • 在 Debian 10 上,构建可选的 `_dbm` 模块还需要安装 `libgdbm-compat-dev`。 (4认同)