我有一台机器,安装了 Python 2.6 作为默认 Python。然后,我安装了 Python 2.7,并手动创建了 /usr/bin/python 作为新安装的符号链接。
然后,我就遇到命令未找到的问题。我正在尝试重新安装它:
sudo apt-get remove command-not-found
我收到此错误:
/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6
但我真的希望 Python 2.7 成为默认值。我该如何解决这个烂摊子?
答案1
更改操作系统上的默认 Python(或 Perl 等)是真的馊主意。该解释器实际上是操作系统的一部分,并且很可能还有专门为与该版本的解释器一起使用而编写的其他操作系统组件。
例如,在 Redhat 上,执行系统软件更新的 yum 工具是一个 python 应用程序。你真的不想打破这个。此类应用程序可能依赖于正在安装的特定(也许是非标准)Python 模块,而您安装的版本可能没有这些模块。例如,在 Ubuntu 上,我相信一些用 Python 编写的内置操作系统工具使用名为 Storm 的 ORM,该 ORM 不属于 Python 标准库的一部分。您的全新 Python 2.7 安装是否安装了特定的预期版本的 Storm 模块?有没有任何版本的 Storm?不?那么你就破坏了操作系统的一部分。
正确的方法是安装您首选的 python 版本,并通过设置 .bash_profile、路径等来设置您的用户帐户以使用它。您可能还想研究 Python 的 virtualenv 模块。
答案2
pyenv
https://github.com/pyenv/pyenv
Pyenv 允许您管理多个 Python 版本,无需为单个用户使用 sudo,就像Node.js NVM和红宝石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
每个项目的使用情况
在上一节中,我们了解了如何在全局设置中使用 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 版本设置为正确的版本。
相关主题:
- https://askubuntu.com/questions/682869/how-do-i-install-a- Different-python-version-using-apt-get
- 管理多个 python 版本的正确方法是什么?
- https://stackoverflow.com/questions/10960805/apt-get-install-for- different-python-versions/59268046#59268046
在 Ubuntu 18.04、pyenv 1.2.15 上测试。
答案3
我该如何解决这个烂摊子?
无非是重装而已python
。它将撤消您的更改(符号链接)。
为什么你想要它作为默认值?每次您需要它时,只需在(可执行)脚本的开头使用python2.7
或包含(shebang)即可。#!/usr/bin/python2.7
如果你坚持要拥有python2.7
作为系统范围的默认值,使用更高版本的 Ubuntu(目前是 Ubuntu 11.04,代号 Natty)。它使用该版本作为默认版本。
将来,请避免像对符号链接所做的那样进行手动干预。对于发行版管理的文件尤其如此,尤其是对于 Python 安装等复杂的文件。
答案4
我们在 Mac 和 Ubuntu 上放置了很多 Python 发行版,以下是我的推荐。