如何使用apt-get安装不同版本的Python?

如何使用apt-get安装不同版本的Python?
显然,我知道可以使用源代码tar包进行安装,但我更愿意使用软件包管理器进行安装,因为这就是它的用途。肯定有一些可靠的地方构建了最新Python版本的.deb文件(为什么python.org没有提供这个服务我无法理解),我可以引用它们。
我需要做什么来引用它们?在升级到下一个版本时可能会出现什么问题?
如果除了从源代码构建之外没有其他方法,是否有一个(伪)软件包可以安装,以提供所有所需的依赖项,而无需逐个查找和安装?这样我就不会遇到以下情况:
The necessary bits to build these optional modules were not found:
_bz2                  _curses               _curses_panel      
_dbm                  _gdbm                 _lzma              
_sqlite3              _ssl                  _tkinter           
readline              zlib  

4http://askubuntu.com/questions/674586/python-3-5-has-just-been-released-can-i-get-it-as-a-package-for-ubuntu-15-4 - h0ch5tr4355
你有没有遇到过E: Couldn't find any package by regex 'python3.5'的错误,导致无法通过apt-get install python3.5安装成功? - Charlie Parker
类似问题:http://askubuntu.com/questions/310441/how-do-i-install-the-latest-python-version-in-ubuntu - Charlie Parker
这里有一些建议:https://www.quora.com/Why-is-it-very-difficult-to-install-Python-3-5-for-Ubuntu - Charlie Parker
相关问题,看起来简单但无法使其工作:http://askubuntu.com/questions/798123/how-do-i-install-python-3-5-2/811935?noredirect=1#comment1372828_811935 - Charlie Parker
1@CharlieParker 你试过安装Anaconda吗? - M. Becerra
@M.Becerra 还没有,那是我接下来要尝试的事情。但问题是我正在使用一个Docker容器,所以我想把这样的解决方案留到最后,除非我真的需要它。 - Charlie Parker
这个答案应该是有用的,因为当前接受的答案似乎提供了一个没有pip的Python版本。在这里查看如何修复这个问题:http://stackoverflow.com/questions/42122639/how-does-one-install-fix-a-failed-numpy-installation-that-works-on-python-3-4-bu/42124828?noredirect=1#comment71418080_42124828 - Charlie Parker
@M.Becerra 我试过Anaconda,似乎运行正常。我也在这里给出了一个答案,如果你有兴趣的话可以看看。谢谢! - Charlie Parker
我发现这些答案都不令人满意。没有一个提到使用update-alternatives。请点击此链接https://www.itsupportwale.com/blog/how-to-upgrade-to-python-3-7-on-ubuntu-18-10/ 使用update-alternatives来升级Python。 - goonerify
我不会使用update-alternatives。我希望只需安装一个Python二进制文件,包括版本号,并在venv安装中使用该路径,以便在该环境中可用的python是安装的那个版本。我认为将当前系统版本的Python移动到其他位置并不是一个好主意。这就是被接受答案所支持的方法。 - NeilG
@AgileZebra,你能帮我检查一下我的答案吗?根据Python的标准实践和PPF(不推荐使用),你可以将其设为正确答案。 - zhrist
11个回答

Felix Krull运营着一个PPA,基本上提供了Python的任何版本(说真的,甚至有适用于vivid的2.3.7版本...)适用于许多Ubuntu发行版,链接在https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa
按照惯例操作:
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.5

它不会覆盖您现有的python3.4,该版本仍然作为python3的符号链接存在。
相反,要运行python3.5,请运行命令python3.5(或者对于任何其他版本的python,请运行python3.X)。

不要更改符号链接!显然有许多系统功能与Python 3.5不兼容。

我尝试过这个方法后,无法打开终端、软件更新器等等...

cd /usr/bin
sudo rm python3

升级到Wily将会使元包python3指向python3.5。我不期望出现任何故障,但此时外部存储库不再需要。所以为了确保安全,你可以在进行升级之前清除PPA。

11对于那些新手来说,不要使用符号链接!同时,不使用符号链接意味着你需要在命令行中输入"python3.5"来运行Python 3.5。 - Chris Hawkes
6你能告诉我,我如何在这个3.5版本上使用3.4的pip吗? - Groosha
2@kondra007 我按照 https://pip.pypa.io/en/stable/installing/ 的指示操作(请仔细阅读警告),执行了这两个命令 wget https://bootstrap.pypa.io/get-pip.py; sudo python3.5 get-pip.py,成功安装了适用于 Python 3.5 的 pip,但是 pip3.4 不再可用。如果有更好的解决方法,请留言告知。 - ndemou
4还有,要将Python3.5设置为默认版本,请执行以下操作:打开终端并输入命令~$ vim ~/.bashrc,然后在文件中添加alias python=python3.5。接下来,运行命令~$ source ~/.bashrc - Krishnadas PC
2提示:如果出现“add-apt-repository: command not found”错误,请运行“apt-get install software-properties-common python-software-properties”命令来安装。 - Mithril
奇怪的是,出于某种原因,我得到了无法找到Python 3.5安装包的错误消息:“E: Couldn't find any package by regex 'python3.5'”,因此它甚至不会安装它。 - Charlie Parker
你介意能不能再解释一下这个警告的意思?是不是说你回答的第二部分真的很糟糕,我们需要一个新的答案来回应这个问题? - Charlie Parker
看起来现在的问题是它没有附带pip。有人知道为什么会这样吗,以及如何解决呢? - Charlie Parker
deadsnakes的更新比这篇帖子要新(2017年01月13日);) - Antony Hatchkins
不要忘记安装python3.5-dev以便为此版本构建软件包。 - Caumons
1有没有办法通过这种方式安装pip包,比如numpy? - xjcl
我可以用同样的方式支持特定的Python子版本吗?例如,Python 3.8.5而不是3.8.6? - CGFoX
add-apt-repository: 找不到该命令 - Shreyan Mehta
如何安装一个精确版本,比如3.5.x?这种方法无法实现! - shaik moeed
@CGFoX 你能找到一种方法来做这件事吗? - shaik moeed

这个Youtube链接帮助我安装它。

步骤如下:

sudo apt-get install libssl-dev openssl
wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz
tar xzvf Python-3.5.0.tgz
cd Python-3.5.0
./configure
make
sudo make install

要检查Python是否已安装,请键入python3.5,否则:
sudo ln -fs /opt/Python-3.5.0/Python /usr/bin/python3.5

10OP说他不想从源代码编译 - Michael Bates
5是的,你说得对。从源代码编译可能会在后续过程中引入一些依赖问题。但这是我解决它的方法。如果有更好的办法,我肯定想知道。 - joydeep bhattacharjee
第四个命令有一点变化,应该是cd Python-3.5.0而不是cd Python-3.5.0.tgz。 - Imran
7考虑使用 ./configure --enable-optimizations 命令。请参考以下链接了解在编译Python时启用优化的作用:http://stackoverflow.com/questions/41405728/what-does-enable-optimizations-do-while-compiling-python - warvariuc
为什么安装一个更新版本的Python 3要用这么长一串命令?这个事情本来很简单啊。 - Charlie Parker
1@CharlieParker 因为Python并不是为特定的操作系统而设计的。它旨在在任何平台上运行。对于Linux来说,这意味着要么每个版本都必须编译和分发给每个Linux发行版的每个版本(其中有很多),要么他们分发源代码,让用户在将来使用的环境中自行编译。后者更加可行。 - JimmyMcHoover
4你还需要从apt-get install build-essential安装C/C++编译器。 - bato3
你需要在上面的列表中添加"apt-get install make gcc"。 - scott
我在执行"make install"时遇到了一个 zlib 依赖问题,所以我只是安装了这些东西,并且它起作用了 https://github.com/pyenv/pyenv/wiki/common-build-problems - Gabe Rogan
警告:make install 可能会覆盖或伪装 python3 二进制文件。因此,建议使用 make altinstall 而不是 make install,因为它只安装 exec_prefix/bin/pythonversion。详见 https://docs.python.org/3/using/unix.html#building-python。 - user149244
如果你明白它在做什么,@CharlieParker,你会意识到这是你想要执行这项工作的最短命令序列。我怀疑你习惯于使用那些通过犯罪活动获得市场份额并通过提供自己认证课程让非技术管理人员认为很好而保持市场份额的图形用户界面操作系统。 - NeilG

只需按照以下步骤进行操作(已经测试过):
第一步 - 安装所需软件包
在安装Python之前,请使用以下命令安装Python的先决条件。
sudo apt-get install build-essential checkinstall
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev

第二步 - 下载Python 3.5.2

使用以下命令从Python官方网站下载Python。您也可以下载最新版本来替代下面指定的版本。

cd /usr/src
sudo wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz

现在解压下载的包。
sudo tar xzf Python-3.5.2.tgz

步骤3 - 编译Python源代码

使用以下命令集在您的系统上使用altinstall编译Python源代码。

cd Python-3.5.2
sudo ./configure
sudo make altinstall

make altinstall用于防止替换默认的Python二进制文件/usr/bin/python

步骤4-检查Python版本

使用以下命令检查安装的Python的最新版本。

$ python3.5 -V

Python 3.5.2

来源


7默认使用altinstall是一个很好的选择。在实际情况中,很少有只使用一个版本的场景。即使在默认使用Python3的系统上,你可能还需要安装反向的Python2或者添加Python2。 - m3nda
1我遇到了一个错误,具体描述在这里 - https://bugs.python.org/issue31652,我不得不运行 sudo apt-get install libffi-dev 来解决它。 - Nishan
我还会添加 sudo apt-get install liblzma-dev 以启用 lzma 支持。 - v.grabovets
好的指南,我认为对于tar和configure命令来说,sudo是不必要的。 - mtdb
1最好和更完整的答案肯定是。 - Kenny Aires
非常好,我的朋友,你帮了我很多。 - Allamo Olsson
Python3.11安装在哪里? - user836049
如@warvariuc所写:考虑使用./configure --enable-optimizations命令,根据工作负载测试构建一个优化版本的解释器。你也可以添加--with-lto选项以进行"链接时优化"。为了以最快的速度进行编译,你可以运行make -j命令:"如果不带参数给出-j选项,make将不限制能够同时运行的作业数"。 - bartolo-otrit
我的Ubuntu依赖项:libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev libgdbm-dev libgdbm-compat-dev 我的配置:./configure CPPFLAGS="-I/usr/include/openssl" LDFLAGS="-L/usr/lib/x86_64-linux-gnu" --enable-optimizations --with-lto - bartolo-otrit

pyenv

这种方法不使用apt-get,但我相信这是目前最好的选择,因为它可以轻松地为您编译任何Python版本的源代码,所以您不必依赖于任何PPA。

https://github.com/pyenv/pyenv

Pyenv允许您在单个用户中管理多个Python版本,无需使用sudo,就像Node.js NVMRuby RVM一样。
安装Pyenv:
curl https://pyenv.run | bash

然后将以下内容添加到您的.bashrc文件中:
export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

查找要安装的Python版本:
pyenv install --list

安装您想要的Python版本:
# Increase the chances that the build will have all dependencies.
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt build-dep python3
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
  libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
  xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

# Build and install a Python version from source.
pyenv install 3.8.0

列出可用的Python版本:
pyenv versions

我们现在有:
* system (set by /home/cirsan01/.pyenv/version)
  3.8.0

选择一个不同的Python版本:
pyenv global 3.8.0
python --version
python3 --version

两者的输出:

Python 3.8.0

我们现在可以正常安装和使用软件包了。
pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'

我们可以确认,在我们的干净环境中,一切都是本地安装的:
python -c 'import cowsay; print(cowsay.__file__)'
which cowsay

我们看到 which python 指向的是:
~/.pyenv/shims/python

因为rc脚本将~/.pyenv/shims添加到PATH中。
还需要进一步了解。全局版本是通过某种方式确定的:
~/.pyenv/version

现在包含的内容:

3.8.0

每个项目的使用情况

在前面的部分中,我们看到了如何在全局设置中使用pyenv。

然而,通常你想要的是在每个项目的基础上设置特定的Python版本和包版本。以下是如何做到这一点。

首先像之前一样安装你想要的Python版本。

然后,在项目目录内,使用以下命令设置所需的Python版本:

pyenv local 3.8.0

这将创建一个包含版本字符串的文件 .python-version

现在,让我们为我们的项目本地安装一个软件包:TODO:似乎没有好的方法:https://stackoverflow.com/questions/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

现在,当有人想要使用你的项目时,他们将执行以下操作:

pyenv local

这将设置Python版本为正确的版本。

相关主题:

在Ubuntu 18.04、pyenv 1.2.15上进行了测试。


更新完.bashrc文件后,别忘了重新加载它。命令是source ~/.bashrc - Peter Piper
2如果你正在使用Ubuntu 22,应该用python3-openssl来替代python-openssl这个软件包。 - Niels Bom

就我所知,在一个docker容器中,至少可以明确地使用apt-get安装Python 3。
首先,我在一个Ubuntu容器中遇到了这个问题:
docker run -it --rm ubuntu:latest bash

然后不知何故它需要更新一些Ubuntu的东西,所以我在容器内进行了更新:

apt-get update && apt-get install -y build-essential git libjpeg-dev

然后我只是安装了Python3,它似乎自动获取了Python 3.5版本。
apt-get install python3
apt-get install python3-pip

为了测试pip是否工作,让我们下载一些东西试试看。
pip3 install tensorflow

对我来说,一切似乎都正常运作。

重要提示:如果您已经安装了Python 3.4,则apt-get install python3不起作用,因为它会显示您已经安装了它。这似乎是我的其中一个问题,因为我是从 TensorFlow 的 Docker 镜像(具体来说是gcr.io/tensorflow/tensorflow:latest-devel-py3)开始的,那个镜像中的某些东西(我猜可能是他们已经有了Python 3.4,但也可能是其他原因)不允许我更新我的 Python 版本到 Python 3.5。


信用:我发现这个问题当我问了以下问题:https://stackoverflow.com/questions/42122826/can-one-use-python-3-5-in-a-docker-container-based-out-of-the-tensorflow-docker
注意:也可以只安装Anaconda。对于Docker示例,可以执行以下操作:
docker pull continuumio/anaconda3
docker run -i -t continuumio/anaconda3 /bin/bash

从他们的官方网站上获取的信息:https://hub.docker.com/r/continuumio/anaconda3/ 这个解决方案安装的是Python 3.6,但如果你查看一下,应该能找到Python 3.5,如果那是你想要的话。
注意:除非你使用Docker,否则你应该使用虚拟环境,比如virtual env或者conda/anaconda。只是提醒大家一下。

2“在一个 Docker 容器中”是一个非常泛化的说法:这完全取决于容器所基于的镜像,例如 Ubuntu 的哪个版本。此外,可能还会有一些次要版本,比如 3.5 或 3.6,在某个 Ubuntu 版本(例如 14.04)中可能不可用。 - giorgiosironi

现在有许多新的Python发行版可以通过apt-get安装,这些发行版在Ubuntu Packages中列出。

例如,目前可用以下版本:

python2.7

python3.2

python3.4

python3.5

python3.6

可用性在某种程度上因Ubuntu版本而异。例如,3.5版本适用于Xenial、Yakkety和Zesty,而3.6版本适用于Yakkety和Zesty,但如果未启用,则必须通过apt-get启用宇宙存储库来获取它们。要检查您的Ubuntu版本的可用性,请查看上面的链接。
一个快速浏览表明,这个答案仍然有效,因为该PPA甚至为Trusty提供了3.6版本。

Ubuntu Repo中提供的Python版本并不是最新的Python版本 - yaitloutou
@yaitloutou 这个问题是说“较新”,而不是“最新”。请随意写出更好的答案。 - Elder Geek
你是正确的,但是由于没有具体说明,我将其解释为最新的。 - yaitloutou
请随意并尽情撰写更好的回答!我相信会受到欢迎。 - Elder Geek
我刚开始在这里活跃起来,还在学习中。如果你觉得我对你的回答发表的评论有些冒昧,我很抱歉。 - yaitloutou

我不同意接受的答案,因为对于Python来说,PPA完全不需要也不推荐使用。
答案很简单:
apt-get update && apt-get install -y \
python3.9 \
python3-pip

Conda正在积极更新,并允许您在受控的虚拟环境中安装多个Python版本,而无需自己设置所有内容,从而避免了繁琐的过程。许多Anaconda管理的依赖/ pip链中可能已经解决了二进制扩展路径问题。

这是对Nephente's answer(即排名第一)的更新,截至2019-10(其中包含根据CC BY-SA 4.0使用的摘录):

Felix Krull在https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa上提供了许多版本的Python,适用于许多Ubuntu发布版。不过,并非所有组合都受支持。如果您的期望组合未受支持,但旧的Ubuntu发布版中有您期望的Python版本可用,您通常仍然可以按照以下方式安装它(以下是Python 3.5的示例):

sudo add-apt-repository "deb http://ppa.launchpad.net/deadsnakes/ppa/ubuntu $(lsb_release -sc) main"
sudo apt-get update
sudo apt-get install python3.5 python3.5-venv

它不会覆盖您现有的Python 3.x版本,之后仍然作为符号链接存在,名为python3。从旧版Ubuntu安装软件包的技巧在这里。我刚刚使用这个方法在Ubuntu 19.04上安装了Python 3.5。

这里有一些很好的答案,几乎涵盖了各种用例(从源代码安装、PPA、pyenv、Docker、Conda)。虽然只有其中几个在技术上明确回答了问题中所提到的apt-get用例,但其他正交的答案对其他读者(比如我)也很有帮助。 @CharlieParker的基于Docker的答案为我的用例指明了正确的方向,非常感谢。然而,正如评论中所指出的,你仍然受限于在容器中基于Ubuntu版本安装Python的apt-get install
作为替代方案,每个当前支持的Python版本(以及最后一个2.x版本)都有官方的Docker镜像。这些镜像已经在工作环境中预先安装好,并包含了pip
例如,只需执行docker pull python:3.7
默认镜像是基于Debian的,因此您仍然可以根据需要apt install其他依赖项。
请注意,它们的大小相当庞大,接近1GB。此外,还有官方镜像的-slim-alpine(基于musl libc)版本,分别约为125GB和6GB。
请参阅Python Docker repo以获取完整列表和详细信息。