管理多个python版本的正确方法是什么?

rip*_*234 25 ubuntu python command-not-found

我有一台安装了 Python 2.6 作为默认 Python 的机器。然后,我安装了 Python 2.7,并手动创建了 /usr/bin/python 作为新安装的符号链接。

然后,我遇到了 command-not-found 的问题。我正在尝试重新安装它:

sudo apt-get remove command-not-found
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6
Run Code Online (Sandbox Code Playgroud)

但我真的希望 Python 2.7 成为默认值。我该如何解决这个烂摊子?

Sim*_*bbs 20

更改操作系统上的默认 Python(或 Perl 等)确实是个坏主意。这个解释器实际上是操作系统的一部分,很可能还有其他操作系统组件是专门为与该版本的解释器一起工作而编写的。

例如,在 Redhat 上,执行系统软件更新的 yum 工具是一个 python 应用程序。你真的不想打破这个。此类应用程序可能取决于正在安装的特定(也许是非标准)python 模块,而您安装的版本可能没有这些模块。例如在 Ubuntu 上,我相信一些用 Python 编写的内置操作系统工具使用了一个名为 Storm 的 ORM,它不是 Python 标准库的一部分。您干净的 Python 2.7 安装是否安装了 Storm 模块的特定预期版本?它有任何版本的Storm吗?不?那么你刚刚破坏了你的操作系统的一部分。

正确的方法是安装您喜欢的 Python 版本,并通过设置您的 .bash_profile、路径等来设置您的用户帐户以使用它。您可能还想查看 Python 的 virtualenv 模块。


tsh*_*ang 9

我该如何解决这个烂摊子?

无非是重新安装python。它将撤消您的更改(符号链接)。

为什么要将其作为默认值?每次需要时,只需在(可执行)脚本的开头使用python2.7或包含#!/usr/bin/python2.7(shebang)即可。

如果您坚持使用python2.7系统范围的默认设置,请使用更高版本的 Ubuntu(目前是 Ubuntu 11.04,代号为 Natty)。它使用该版本作为默认版本。

将来,避免像您对符号链接所做的那样进行手动干预。对于发行版管理的文件尤其如此,尤其是对于像 Python 安装这样的复杂野兽。

  • @ripper234:不要更改`/usr/bin` 中的任何内容,这是为您的发行版保留的。相反,让 `/usr/local/bin/python` 成为 `python2.7` 的符号链接。然后使用`#!/usr/bin/env python`(推荐的习惯用法)以及在命令行上输入`python` 的脚本将运行Python 2.7。发行版中想要 Python 的脚本可以继续调用 `#!/usr/bin/python`。 (13认同)
  • @ripper:我想我来这个帖子有点晚了。正如 Tshepang 所说,Ubuntu 上的 `python` 包决定了系统版本。现在,可以通过创建自己的 Python 包等来自定义您的安装,因此默认使用 python 2.7,但如果是这样,您将有效地成为 Python 安装的维护者,而不是 Ubuntu,并且您必须学习 Python在 Debian/Ubuntu 上管理。请记住,系统中的其他 Python 包默认配置为使用 2.6,因此,除此之外,可能会导致损坏。 (2认同)

Cir*_*郝海东 7

pyenv

https://github.com/pyenv/pyenv

Pyenv 允许您为单个用户管理多个 Python 版本,而无需 sudo,就像Node.js NVMRuby RVM 一样

安装 Pyenv:

curl https://pyenv.run | bash
Run Code Online (Sandbox Code Playgroud)

然后添加到您的.bashrc

export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Run Code Online (Sandbox Code Playgroud)

找到要安装的 Python 版本:

pyenv install --list
Run Code Online (Sandbox Code Playgroud)

安装你想要的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
Run Code Online (Sandbox Code Playgroud)

列出可用的 Python 版本:

pyenv versions
Run Code Online (Sandbox Code Playgroud)

我们现在有:

* system (set by /home/cirsan01/.pyenv/version)
  3.8.0
Run Code Online (Sandbox Code Playgroud)

选择不同的python版本:

pyenv global 3.8.0
python --version
python3 --version
Run Code Online (Sandbox Code Playgroud)

两个输出:

Python 3.8.0
Run Code Online (Sandbox Code Playgroud)

我们现在可以继续正常安装和使用软件包:

pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'
Run Code Online (Sandbox Code Playgroud)

我们可以通过以下方式确认所有内容都已本地安装在我们干净的环境中:

python -c 'import cowsay; print(cowsay.__file__)'
which cowsay
Run Code Online (Sandbox Code Playgroud)

每个项目使用

在上一节中,我们看到了如何在全局设置中使用 pyenv。

但是,您通常想要的是在每个项目的基础上设置特定的 python 和包版本。这是如何做到的。

首先像以前一样安装所需的 Python 版本。

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

pyenv local 3.8.0
Run Code Online (Sandbox Code Playgroud)

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

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

现在,当有人想使用你的项目时,他们会这样做:

pyenv local
Run Code Online (Sandbox Code Playgroud)

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

相关主题:

在 Ubuntu 18.04、pyenv 1.2.15 上测试。