我全新安装了 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
- 克隆 python git 存储库。
$ git clone [email protected]:python/cpython.git
Cloning into 'cpython'...
[...]
Resolving deltas: 100% (592215/592215), done.
- 使用 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$
- 选择安装前缀。即编译和链接的项目将安装到的路径。在本例中,我将使用
$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
脚本将检查很多内容,其中许多内容都是不必要的。不过,上面输出中显示的那些内容可以视为必需的。
- 通过运行来构建 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
模块,它可能无法成功构建和安装。
- 通过运行 安装 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
[...]
- 现在您应该有一个可执行文件,可以从
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()
$