如何在Ubuntu上安装最新的Python 2.7.X或3.X版本?

我想在Ubuntu上安装最新的Python tarball,从http://python.org/download/下载。
这是正确的安装方式吗?
./configure
make
make install

如果不行,我该怎么办?

2曾经,我想这个问题是为了在Ubuntu上安装一个更新的Python版本。现在,我们需要在Ubuntu上安装一个旧版本的Python(因为我们仍然需要Python 2.7来完成很多事情)... 简而言之:这个答案已经不再适用/正确。相反,假设默认已安装了Python3(可能还有一个最小的Python2.x),然后运行:sudo apt-get install python-2.7 python-pip - michael
@michael_n 你在说什么?从源代码编译并不意味着这个答案是错误的或过时的,它只是一种不同的方法。如果需要,你可以使用apt来自动化这个过程。 - user383919
你用什么就用什么吧。我真的不明白这怎么支持你认为这已经过时的说法。就像你自己说的,你在需要的时候才会使用它,因为可能没有其他选择。例如,Windows子系统用了一些旧的软件包,尽管发行版是Ubuntu 16.04.1(测试版),还使用了Python2.6.2和Python3,尽管当前版本是Python2.7.12。在这种情况下,如果我想要更新的软件包,我应该自己编译。 - user383919
1@jargonjunkie 你离题了,但是说得对。如果问题是“如何在Ubuntu 16.04上安装Python 2.7”,这正是问题所在(因为16.04现在可用,这就是我的观点),那么你只需执行sudo apt-get install python2.7。这不仅更简单,也是唯一正确的答案,因为这是你能够通过apt-get安装Python模块及其依赖项的唯一方式。 - michael
希望这有助于说明(补充答案)。Python生态系统非常特别和挑剔,如果你不仔细构建Python环境,很容易陷入“依赖地狱”的困境。 - michael
你说得完全正确。你可以轻松地从网站索引依赖关系。实际上,子系统使用的是14.04.5版本,并默认使用2.7.2(当然还有Python 3)。apt-get并不总是可行的选择,了解dpkg的存在是很有帮助的。这对于一些自定义场景非常有用,这些选项可能不可用,虽然并不总是最佳选择(显然,如果你能使用apt,应该使用apt)。我有几个自定义环境不支持很多Debian软件包,所以我经常使用dpkg。在紧急情况下知道如何使用它是非常有价值的。 - user383919
6个回答

首先,安装一些依赖项:
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

然后使用以下命令下载:
version=2.7.13
cd ~/Downloads/
wget https://www.python.org/ftp/python/$version/Python-$version.tgz

提取并转到目录:
tar -xvf Python-$version.tgz
cd Python-$version

现在,使用您刚才尝试的命令进行安装,但是请改用checkinstall,这样如果需要卸载会更方便:
./configure
make
sudo checkinstall

version更改为您需要的版本(例如version=2.7.1version=3.6.0)。

20使用 sudo make install 而不是 altinstall 来将其设置为默认的 Python 版本。 - Shagun Sodhani
如果 ./configure 发出警告,表示找不到 g++,请使用 CXX=g++ ./configure - srj
2按照上述指示安装完成后,我应该在控制台中运行哪些命令来检查是否确实已安装? - J86
无法找到软件包libreadline-gplv2-dev。似乎已被重命名为apt-cache search libreadline以获取其他选择项。 - Pierre de LESPINAY
回应“在控制台中运行哪些命令来检查……”的问题,肯定是更快的方法是通过谷歌搜索类似“检查Python是否已安装”的内容,以获得即时详细信息,而不是等待回复。 - Angry 84
当前未安装程序'checkinstall'。 - hfrmobile
使用python -V命令来检查已安装的版本。 - Lukas Liesis
12令人惊讶的是,对于一个简单问题“如何安装Python”的最佳答案竟然带有如此可怕的警告,就好像是在说“这是我们所知道的最好的安装方法,但它很可能会破坏你的系统”... 同样令人惊讶的是,官方Python网站上有大量的下载内容,却没有一张安装说明页面。 - patb
4pat -- 如何安装Python这个简单问题的最佳答案是sudo apt-get install python,更复杂的答案是"如何安装_最新版本_的Python",暗示着需要从源代码进行安装。无论在哪个操作系统上,除非你安装来自第三方的预编译二进制文件,否则都会遇到相同的问题,而这在任何操作系统上都存在风险(并且在不同的操作系统上差异很大)。此外,这个答案是2012年的,如果需要更近期的建议,请参考https://askubuntu.com/questions/101591/how-do-i-install-the-latest-python-2-7-x-or-3-x-on-ubuntu/831075#831075。 - michael
嘿伙计们,如果你想在最新的Python上安装pip,请使用./configure --with-ensurepip=install而不是./configure - christianbueno.1
按照这个步骤并阅读下面提到的答案。首先尝试通过"sudo apt-get install python2.7"安装Python。如果不起作用,再试试这个方法。在这个过程中出了点问题,花了我3个小时来解决两个该死的问题,如果我没有尝试自己构建Python,本来是不应该有这些问题的。还是要感谢你为那些想要构建它的人提供了详细的答案。 :) - Xonshiz
@achu 如果我做了这个,我该如何卸载它? - Chef Pharaoh

除非你真的非常想亲自编译,否则最好的方法是使用DeadSnakes PPA来安装默认情况下不包含的Python版本。
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python2.7

其他版本,例如 python2.4python3.6 等等,也是可用的。

13注意事项:如果您使用的是10.04版本,使用add-apt-repository之前可能需要安装python-software-properties。 - user1614
3建议在本地环境中构建Python,而不是从预构建的二进制文件中安装它。 - pylover
17+1 :) 真的很想自己编译它 - Watt
5忘了提到:1. ppa 不是官方认可的,所以最安全的方式是从源代码构建。2. 这将导致一个全局的 Python,非 sudo 用户无法修改或安装软件包,而不是一个本地的 Python。3. 通过从源代码构建,可以在不同位置本地安装多个 Python。 - 0 _
@IoannisFilippidis 从源代码构建的缺点是它无法被apt跟踪。:( - weberc2
2apt-get install python2.7 这会安装二进制的 Python2.7 而不是 Python... 很丑陋!! - Dhawal
将被显示为 python2.7 命令。可执行文件的位置为 /usr/bin/python2.7 - Nitin
1这可能在您升级时/如果您升级时会破坏您的系统... - dermen
原来自己编译并不那么难,所以我认为最好还是自己动手,这样就少了一个需要信任的方,这总是件好事。 - Display Name
这对我在Ubuntu 14.04上不起作用,因为deadsnakes只包括Python 2.7适用于那些没有自己的发行版本的。所以Ubuntu 14.04仍然停留在Python 2.7.6而不是2.7.13。 - giorgiosironi
刚刚尝试在Ubuntu服务器(AWS EC2实例)上安装Python2.7,但在apt-get install之后,python2.7命令无法使用。是因为缺少设置环境变量的软件包吗? - v.oddou
虽然,在安装pip之后,使用命令sudo apt-get install python-pip,Python就可以正常工作了。 - v.oddou
@giorgiosironi 使用virtualenv来实现。我也建议任何需要不同微版本号的人都这样做。 - wjandrea

继续为最新的Ubuntu版本记录此问题:对于Ubuntu 16.04.1服务器,默认的Python版本是3.5,并且Python 2.7不会被默认安装。在全新安装的系统上(需要注意的是,甚至没有python可执行文件):
$ type python3 python2 python 
python3 is /usr/bin/python3
-bash: type: python2: not found
-bash: type: python: not found

$ python3 --version 
Python 3.5.2

$ python --version 
The program 'python' can be found in the following packages:
 * python-minimal
 * python3
Try: sudo apt install <selected package>

注意:在继续之前,您可能希望执行以下命令:

sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade 请确切了解这些命令的实际作用;我假设您是进行全新安装。

安装Python 2.7非常简单:

$ sudo apt-get install python2.7

安装Python 2.7后的初始输出如下:
$ sudo apt-get install python2.7
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libpython2.7-minimal libpython2.7-stdlib python2.7-minimal
Suggested packages:
  python2.7-doc binutils binfmt-support
The following NEW packages will be installed:
  libpython2.7-minimal libpython2.7-stdlib python2.7 python2.7-minimal
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,735 kB of archives.
After this operation, 15.8 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...etc, etc...

安装完Python 2.7之后,
$ type python3 python2.7 python3.5 python2 python
python3 is /usr/bin/python3
python2.7 is /usr/bin/python2.7
python3.5 is /usr/bin/python3.5
bash: type: python2: not found
bash: type: python: not found

但是还有一个问题,因为你还不能通过pip安装PyPI模块 - 例如,如果你想要jupyter notebook,或者最新的scipy或numpy(等等),你会想要安装pip,然后使用pip安装它们,并且仍然需要使用apt-get来安装任何所需的系统依赖,比如graphviz或核心系统库。
$ type pip3 pip2 pip
bash: type: pip3: not found
bash: type: pip2: not found
bash: type: pip: not found

$ python3 -m pip --version 
/usr/bin/python3: No module named pip

要安装pip,同样很简单:sudo apt-get install python-pip

$ sudo apt-cache search -n pip | egrep '^python[0-9]*-pip'
python-pip - alternative Python package installer
python-pip-whl - alternative Python package installer
python3-pip - alternative Python package installer - Python 3 version of the package

你需要同时安装Python 2.7的pip和Python 3的pip。通过apt-get安装可以确保安装所需的依赖项;例如,以下是安装pip2的输出:
$ sudo apt-get install python-pip
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  binutils build-essential dpkg-dev fakeroot g++ g++-5 gcc gcc-5 libalgorithm-diff-perl
  libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan2 libatomic1 libc-dev-bin libc6-dev
  libcc1-0 libcilkrts5 libdpkg-perl libexpat1-dev libfakeroot libfile-fcntllock-perl libgcc-5-dev
  libgomp1 libitm1 liblsan0 libmpx0 libpython-all-dev libpython-dev libpython-stdlib libpython2.7
  libpython2.7-dev libquadmath0 libstdc++-5-dev libtsan0 libubsan0 linux-libc-dev make
  manpages-dev python python-all python-all-dev python-dev python-minimal python-pip-whl
  python-pkg-resources python-setuptools python-wheel python2.7-dev
Suggested packages:
  binutils-doc debian-keyring g++-multilib g++-5-multilib gcc-5-doc libstdc++6-5-dbg gcc-multilib
  autoconf automake libtool flex bison gdb gcc-doc gcc-5-multilib gcc-5-locales libgcc1-dbg
  libgomp1-dbg libitm1-dbg libatomic1-dbg libasan2-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg
  libcilkrts5-dbg libmpx0-dbg libquadmath0-dbg glibc-doc libstdc++-5-doc make-doc python-doc
  python-tk python-setuptools-doc
The following NEW packages will be installed:
  binutils build-essential dpkg-dev fakeroot g++ g++-5 gcc gcc-5 libalgorithm-diff-perl
  libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan2 libatomic1 libc-dev-bin libc6-dev
  libcc1-0 libcilkrts5 libdpkg-perl libexpat1-dev libfakeroot libfile-fcntllock-perl libgcc-5-dev
  libgomp1 libitm1 liblsan0 libmpx0 libpython-all-dev libpython-dev libpython-stdlib libpython2.7
  libpython2.7-dev libquadmath0 libstdc++-5-dev libtsan0 libubsan0 linux-libc-dev make
  manpages-dev python python-all python-all-dev python-dev python-minimal python-pip
  python-pip-whl python-pkg-resources python-setuptools python-wheel python2.7-dev
0 upgraded, 49 newly installed, 0 to remove and 0 not upgraded.
Need to get 61.1 MB of archives.
After this operation, 169 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...etc...

由此产生了一个有趣的事情:现在你有了“标准”(并且是PEP推荐的)python2python3(它们只是指向python 2.7和python 3.5的符号链接):
$ type python3 python2 python python2.7 python3.5 
python3 is /usr/bin/python3
python2 is /usr/bin/python2
python is /usr/bin/python
python2.7 is /usr/bin/python2.7
python3.5 is /usr/bin/python3.5

在安装之前,您还需要运行sudo apt-get install python3-pip命令。
$ type pip pip2 pip3
pip is /usr/bin/pip
pip2 is /usr/bin/pip2
-bash: type: pip3: not found

$ python2 -m pip --version 
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)

$ python3 -m pip --version 
/usr/bin/python3: No module named pip

安装完pip3之后,
$ sudo apt-get install python3-pip
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libpython3-dev libpython3.5-dev python3-dev python3-setuptools python3-wheel python3.5-dev
Suggested packages:
  python-setuptools-doc
The following NEW packages will be installed:
  libpython3-dev libpython3.5-dev python3-dev python3-pip python3-setuptools python3-wheel python3.5-dev
0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded.
Need to get 38.0 MB of archives.
After this operation, 55.2 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
...etc...

生成的版本:
$ type python python2 python3 pip pip2 pip3
python is /usr/bin/python
python2 is hashed (/usr/bin/python2)
python3 is hashed (/usr/bin/python3)
pip is /usr/bin/pip
pip2 is /usr/bin/pip2
pip3 is /usr/bin/pip3

$ pip --version 
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)

$ pip3 --version 
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

$ python2 -m pip --version 
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)

$ python3 -m pip --version 
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

在你开始安装所有喜欢的Python PyPI模块之前,还有一件事情要做:你可能需要升级pip本身(分别升级pip2和pip3;另外,无论是通过python可执行文件还是pip可执行文件调用pip,实际的升级都存储在/usr/lib目录下):
$ sudo -H python2 -m pip install --upgrade pip
...
$ sudo -H python3 -m pip install --upgrade pip
...

现在你可以运行独立的pip,也可以使用捆绑在python中的版本(通过python -m pip {command})。

[1] 历史回顾:早期的Ubuntu只有Python 2.6,因此需要采用各种方法来安装Python 2.7+。后来,当Python 2.7被添加到公共软件库中时,我们仍然面临着安装最新的修复版本Python 2.7的挑战,这在很多情况下都是必要的。如今情况好得多/简单得多:当前的Python 2.7和3.5(基本上是人们关心的两个Python平台版本)已经在公共软件库中非常稳定,因此现在我们只需要担心安装最新的Python模块,而不是最新的Python版本。因此,现在Python“最新版本问题”部分地从操作系统软件库和apt转移到了PyPI和pip。)


2按照这些指示,在Ubuntu 16.04.1 LTS上成功设置了Python 2.7和pip,步骤如下:sudo apt-get install python2.7; sudo apt-get install python-pip; sudo -H python2 -m pip install --upgrade pip; # 检查版本:$ pip --version -> pip 9.0.1 from /usr/local/lib/python2.7/dist-packages (python 2.7); $ python --version -> Python 2.7.12 - Robert Lujo
请原谅我的无知,我可以知道在显示Python版本时,“hashed”是什么意思吗? - Failed Scientist
1@TalhaIrfan 这是一个很好的问题(如果你允许我给出一个简化的答案):当在bash中输入命令时(与大多数shell一样),该命令可以是别名、函数或者在$PATH中找到的可执行文件。环境变量PATH是一个包含成千上万个文件的长列表。为了加快查找可执行文件的速度,shell使用了一个缓存哈希表进行快速查找。然而,这个缓存有可能过期,所以"hashed"告诉你它"记住"了这个命令映射到那个可执行文件。详细信息请参考:https://unix.stackexchange.com/questions/5609/how-do-i-clear-bashs-cache-of-paths-to-executables - michael
@michael 非常感谢!这个回答真的非常有用:简明扼要! - Failed Scientist
非常好的答案。我按照它的指示,在我的UBUNTU 16.04 LTS机器上成功安装了Python 2.7并与其他版本共存。 - rjha94
太棒了!谢谢 @michael。在运行最后两个命令 2/3 -m pip install --upgrade pip 之前,我得到的是 pip --version: pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)pip3 --version: pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)。现在如果我运行它们,我会得到 Traceback (most recent call last): File "/usr/bin/pip(3)", line 9, in <module> from pip import main ImportError: cannot import name main。如果我使用sudo运行,它可以正常工作,并显示版本为 pip 18.0 from ...。如何使它们再次在不使用sudo的情况下正常工作呢? - Gaia
1@gaia,您可能需要提出一个单独的问题,因为可能需要更多的来回交流才能弄清楚(或者如果自我撰写以来有任何变化)。首先,请验证是否已完全安装/升级了pip(2.7)和pip3(3.x),而不仅仅是前者 - 即sudo apt-get install python-pip python3-pipsudo -H python2 -m pip install --upgrade pipsudo -H python3 -m pip install --upgrade pip。...或者如果确实是权限问题(由“使用sudo可以解决”表示),那么跟踪它将会更加困难。 - michael

12.04

如果你正在遵循Achu的回答,那么术语libread5-dev应该改为libreadline-gplv2-dev。所以完整的命令应该是:
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev

你也可以通过pyenv下载并安装它。
#Install Pyenv
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
export PATH=~/.pyenv/bin:/usr/local/hadoop/bin/:$PATH
echo 'export PYENV_ROOT="~/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

#Install Python
pyenv install 2.7.8
pyenv global 2.7.8

pyenv install 3.4.5
pyenv global 3.4.5

这是在旧版本的Ubuntu上获得最新版本Python的最干净的方法。它还包括对virtualenv的支持,通过pyenv-virtualenv插件,使得安装具有不同模块需求的应用程序变得容易,避免冲突。 - RichVel
2关于pyenv有两个警告:(1) 它只能在bash shell中工作(或者可能是zsh,但绝对不是Ubuntu上的/bin/sh即dash),(2) 它需要一个登录shell(例如bash --login),这在某些情况下并不容易实现,比如使用Ansible。最适合交互式使用,对于脚本化服务器来说效果较差。 - RichVel

这基本上是这个答案的镜像,只是稍微修改了一下开头

我建议使用pyenv。它自动化了构建过程,除了安装头文件依赖项(见下文)。您可以通过简单地说pyenv install 3.6.0来构建和安装新版本(或旧版本)的Python。所有内容都以您的用户身份运行,因此您不必担心搞乱Ubuntu本身使用的Python

与一些基于apt-repo的选项(例如deadsnakes)相比,它通常会在发布后的同一天工作,只需进行pyenv update,因为您不需要等待其他人打包。查看您可以使用pyenv install --list安装的所有版本。

安装pyenv

  1. 安装构建CPython所需的工具和头文件(例如PyPy或Jython等特殊版本的Python可能有其他依赖项)。pyenv使用Git,它还可以构建/安装源代码分支,因此您可以安装最新的3.8版本,即从GitHub上获取的CPython的主分支:

    sudo apt-get install -y git
    sudo apt-get install -y build-essential libbz2-dev libssl-dev libreadline-dev \
                            libffi-dev libsqlite3-dev tk-dev
    
    # 可选的科学包头文件(用于Numpy、Matplotlib、SciPy等)
    sudo apt-get install -y libpng-dev libfreetype6-dev    
    
  2. 运行安装脚本(安装pyenv和一些非常有用的pyenv插件,由原作者提供;更多信息请参见这里

    curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
    
  3. 将初始化命令添加到您的~/.profile~/.bashrc文件中(安装脚本的末尾有提到):

    export PATH="~/.pyenv/bin:$PATH"
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
    
  4. 重新启动您的shell(关闭并打开,或者执行exec $SHELL)或重新加载配置文件(例如source ~/.bashrc

设置环境
为了不触动系统自带的Python(一般来说这是个坏主意;操作系统级别的服务可能依赖于某些特定的库版本等),你可以搭建自己的环境,非常简单!更好的是,无需使用sudo命令,既不需要对其进行安装。
  1. 安装您首选的Python版本(这将下载源代码并为您的用户构建它,无需输入)

    pyenv install 3.6.0
    
  2. 将其设置为虚拟环境,以便以后可以创建其他环境

    pyenv virtualenv 3.6.0 general
    
  3. 全局激活它(对于您的用户)

    pyenv global general
    
  4. 随意使用Python/pip等。这是您的。

如果你想稍后清理你的库,你可以删除虚拟环境(`pyenv uninstall general`)或创建一个新的(`pyenv virtualenv 3.6.0 other_proj`)。你也可以在每个目录下设置活动环境:`pyenv local other_proj`会在当前文件夹中生成一个`.python-version`文件,当你从该文件夹中调用Python或pip安装的Python工具时,它们将被pyenv代理。

故障排除

  • bash: pyenv: command not found, fish: Unknown command 'pyenv'

    1. 检查你的$PATH,应该有一个条目以.pyenv/bin结尾。如果缺失,请确保你按照上面安装pyenv的第3和第4步(重新启动shell)。
  • pyenv: no such command 'virtualenv'

    1. 如果你没有使用安装脚本,那么你可能只安装了根pyenv包。请参考pyenv-virtualenv的说明来添加插件。
    2. 如果你使用了安装脚本,请检查是否显示为pyenv commands