不同版本的Python安装情况明确

我在Ubuntu上安装Python遇到了一个令人困惑的情况。
$ python --version
Python 3.4.0
$ python2 --version
Python 3.4.0
$ python3 --version
Python 3.4.0
$ ls -la /usr/bin/python2
lrwxrwxrwx 1 root root 9 Dez 21  2013 /usr/bin/python2 -> python2.7
$ ls -la /usr/bin/python3
lrwxrwxrwx 1 root root 9 Mär 23  2014 /usr/bin/python3 -> python3.4

我想要的只是在命令“python”下执行python3.4。因此,我将/usr/bin/python3复制到/usr/bin/python,因为“python --version”返回2.7,现在返回3.4。我不知道这是否是一个错误。
我尝试使用pip安装软件包,但失败了。然后我尝试重新安装python(sudo apt-get install --reinstall python),终端给了我提示运行“apt-get -f install”而不需要软件包名称。
$ sudo apt-get -f install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
8 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up python2.7 (2.7.6-8) ...
  File "/usr/lib/python2.7/py_compile.py", line 114
    except Exception,err:
                    ^
SyntaxError: invalid syntax
dpkg: error processing package python2.7 (--configure):
 subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of python:
 python depends on python2.7 (>= 2.7.5-1~); however:
  Package python2.7 is not configured yet.

dpkg: error processing package python (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of python-dateutil:
 python-dateutil depends on python (>= 2.7); however:
  Package python is not configured yet.
 python-dateutil depends on python (<< 2.8); however:
  Package python is not configured yet.
 python-dateutil depends on python:any (>= 2.7.1-0ubuntu2); however:
  Package python is not configured yet.

dpkg: error processing package python-dateutil (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of python-gst-1.0:
 python-gst-1.0 depends on python (>= 2.7); however:
  Package python is not configured yet.
 python-gst-1.0 depends on python (<< 2.8); however:
  Package python is not configured yet.
 python-gst-1.0 depends oNo apport report written because the error message indicates its a followup error from a previous failure.
                                                                                                                                   No apport report written because the error message indicates its a followup error from a previous failure.
                                              No apport report written because MaxReports is reached already
                                                                                                            No apport report written because MaxReports is reached already
                                                                                                                                                                          No apport report written because MaxReports is reached already
                                         No apport report written because MaxReports is reached already
                                                                                                       No apport report written because MaxReports is reached already
                                                                                                                                                                     n python:any (>= 2.7.1-0ubuntu2); however:
  Package python is not configured yet.

dpkg: error processing package python-gst-1.0 (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of python-pyparsing:
 python-pyparsing depends on python (>= 2.7); however:
  Package python is not configured yet.
 python-pyparsing depends on python (<< 2.8); however:
  Package python is not configured yet.
 python-pyparsing depends on python:any (>= 2.7.1-0ubuntu2); however:
  Package python is not configured yet.

dpkg: error processing package python-pyparsing (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of python-tz:
 python-tz depends on python (>= 2.7); however:
  Package python is not configured yet.
 python-tz depends on python (<< 2.8); however:
  Package python is not configured yet.
 python-tz depends on python:any (>= 2.7.1-0ubuntu2); however:
  Package python is not configured yet.

dpkg: error processing package python-tz (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of python-support:
 python-support depends on python (>= 2.5); however:
  Package python is not configured yet.

dpkg: error processing package python-support (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of python-matplotlib:
 python-matplotlib depends on python-dateutil; however:
  Package python-dateutil is not configured yet.
 python-matplotlib depends on python-pyparsing; however:
  Package python-pyparsing is not configured yet.
 python-matplotlib depends on python-tz; however:
  Package python-tz is not configured yet.
 python-matplotlib depends on python (<< 2.8); however:
  Package python is not configured yet.
 python-matplotlib depends on python (>= 2.7); however:
  Package python is not configured yet.
 python-matplotlib depends on python-support (>= 0.90.0); however:
  Package python-support is not configured yet.

dpkg: error processing package python-matplotlib (--configure):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 python2.7
 python
 python-dateutil
 python-gst-1.0
 python-pyparsing
 python-tz
 python-support
 python-matplotlib
E: Sub-process /usr/bin/dpkg returned an error code (1)
$ 

我已经尝试过将链接改回来了。
$ sudo cp /usr/bin/python2.7 /usr/bin/python
$ python --version
Python 3.4.0
$ sudo cp /usr/bin/python2 /usr/bin/python
$ python --version
Python 3.4.0
$

我应该怎么做才能同时安装Python2和Python3?如何使用apt-get重新安装Python?

过去,如果你改变了Python的链接,那就需要完全重新安装,因为即使是互联网也需要正确的Python版本。现在,你只需要以同样的方式将链接改回来就可以了。只需使用Python2版本来链接到Python即可。Ubuntu一直计划完全转向Python3,但目前还没有实施。 - oldfred
我更新了我的问题。在你的回答之后,我不敢重新启动... - Sadık
2Python链接必须是Python2。要运行Python3,只需指定Python3即可。您可以将所有仅限于Python2的代码更改为使用Python2,因此默认情况下通常不会使用Python,但许多旧的尚未更新的代码仍需要Python作为Python2链接。当转换为Python3时,除非将其更新为特别引用Python2链接而不是Python链接,否则可能会遇到类似的问题运行遗留的Python2代码。 - oldfred
我看到了。但是好像我不再有Python 2了。看看版本!python2.7 --version 给出的是3.4,而且我无法重新安装它。 - Sadık
1个回答

在大多数Ubuntu安装中,Python 2和3可以很愉快地共存。你所描述的(python3映射到Python 2二进制文件)根本不正常。

python默认情况下需要映射到Python 2。有一些脚本不符合Python 3的规范(它不向后兼容),所以如果你破坏了对python的映射,就会破坏系统。

你已经从期望使用Python 2的软件包的postinst脚本中看到了这一点。

以下是我的python映射方式(一个14.04版本的安装):

$ readlink -f $(which python)
/usr/bin/python2.7

所以让我们把"/usr/bin/python"重新映射回去吧。
sudo rm /usr/bin/python
sudo ln -s /usr/bin/python{2.7,}

然后运行sudo apt-get -f install,现在应该能够无错误地运行。
如果你把事情搞得一团糟,可能会发现自己需要手动解压Python软件包到系统中(它们只是带有头部数据的压缩文件)。
如果你刚刚捣毁了`/usr/bin/python2.7`(应该是Python 2的二进制文件),你可以通过下载`python2.7-minimal`软件包并将二进制文件提取到正确的位置来替换它。
apt-get download python2.7-minimal
ar x python2.7-minimal_*.deb data.tar.xz
sudo tar xJf data.tar.xz -C / './usr/bin/python2.7'
rm data.tar.xz

这是基于当前的14.04版本包。如果你使用的是其他版本,可能需要调整路径。或者从运行相同版本Ubuntu的实际系统中复制。
更广泛地说,如果你想要一个Python开发环境,我强烈建议你看看 venv模块。这与Py2的VirtualEnv类似,只是它内置了。你可以以非root、非系统的方式安装任何你喜欢的东西,包括将python映射到你选择的Python二进制文件(包括Pypy)。
在14.04版本中,Python 3存在一个需要修复的bug,需要解决才能创建venv,但目前可以很容易地绕过这个问题。我们只需要安装ensurepip即可。
wget -qO- http://d.pr/f/YqS5+ \
| sudo tar xzf - -C $(python3 -c "import sys; print(sys.path[1])") --no-same-owner

然后创建并激活虚拟环境:
python3 -m venv myvenv
source ./myvenv/bin/activate

现在你在自己的游乐场里。将来你需要调用 activate 命令(或明确调用 myvenv/bin/python 二进制文件)来加载正确的 Python 路径。

$ readlink -f $(which python) /usr/bin/python2.7 $ python --version Python 3.4.0 $apt-get -f install 仍然无法正常工作。 - Sadık
@Sadik 如果您对/usr/bin/python2.7文件进行了一些在问题中没有提到的操作,那么您可能需要下载适用于您发行版的python2.7-minimal软件包,并将其解压覆盖您损坏的版本。 - Oli
如果我早知道自己对Python 2.7做了什么,我本来会提及的。好吧,我试试看... - Sadık
我下载了 python2.7python2.7-minimal,并通过 dpkg -i *.deb 安装它们。然而,这给了我一个错误,但在执行 apt-get install -f 后解决了!谢谢。 - Sadık
嘿,刚刚我在研究一些命令,可以帮你提取二进制文件。我已经添加它们以供将来参考。 - Oli