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


21

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

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

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是默认的。我该如何解决此问题?

Answers:


16

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

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

正确的方法是安装首选版本的python并通过设置.bash_profile,路径等来设置用户帐户以使用它。您可能还想研究Python的virtualenv模块。


1
在这里搜寻了我的方式。如果我在该堆栈上有代表,将为-1。为什么?因为建议的方法只说“安装首选的python版本”。如何是,没有冲水系统蟒蛇做了什么?
jez

@jez用户应参考安装说明,以选择其应用程序和操作系统。通常,语言安装程序包将安装在良性位置,而不是覆盖核心OS组件,因此覆盖OS版本将是特例。
西蒙·希伯斯

8

我该如何解决此问题?

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

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

如果您坚持要在python2.7系统范围内使用默认值,请使用更高版本的Ubuntu(当前为Ubuntu 11.04,代号为Natty)。它默认使用该版本。

将来,请避免进行人工干预,例如对symlink进行的操作。对于发行版托管的文件尤其如此,对于Python安装等复杂的野兽而言尤其如此。


我认为,升级后更改默认的python安装是合理的。我希望将其作为默认值,因为我想使用较新的python ...作为默认值。当我python从bash 键入内容时,我想获取新的python。有没有比我做的更好的方法了?
ripper234 2011年

请注意-我认为安装python 2.7的方式没有任何问题。唯一“非正统”的举动就是更改符号链接,我认为这是其设置为默认值的正确方法。有没有更好的办法?
ripper234 2011年

2
@ripper:我想我来这个线程有点晚了。正如Tshepang所说python,Ubuntu上的软件包确定了系统版本。现在,可以自定义安装,因此通过创建自己的python包等将python 2.7缺省为默认设置,但是如果是这样,您将有效地成为Python安装的维护者,而不是Ubuntu,并且您将必须学习Python在Debian / Ubuntu上进行管理。请记住,系统中的其他Python软件包默认配置为使用2.6,因此,除其他事项外,可能会导致损坏。
Faheem Mitha

1
@Tshepang:总结不错!
Faheem Mitha

12
@ ripper234:请勿更改中的任何内容/usr/bin,以供您分发。而是/usr/local/bin/python将符号链接到python2.7。然后,使用#!/usr/bin/env python(推荐的惯用法)以及python在命令行上键入的脚本将运行Python 2.7。需要发行版中的Python的发行版脚本可以继续调用#!/usr/bin/python
吉尔(Gilles)“所以,别再邪恶了”,

2

免责声明:我刚刚将相同的答案发布到堆栈溢出:

/programming/2812520/pip-dealing-with-multiple-python-versions/50319252

这是我对这个问题的看法。适用于Python3。主要特点是:

  • 每个Python版本均从源代码编译
  • 所有版本均在本地安装
  • 不会以任何方式破坏系统的默认Python安装
  • 每个Python版本都通过virtualenv隔离

步骤如下:

  1. 如果您以其他方式安装了几个额外的python版本,请摆脱它们,例如,删除$ HOME / .local / lib / python3.x等(以及全局安装的版本)。但是不要触摸系统的默认python3版本。

  2. 在以下目录结构下的不同python版本的下载源:

    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
  3. 在每个“ Python-3.xy /”目录中,执行以下操作(在任何步骤中都不要使用“ sudo”!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. 在“ python_versions /”处创建如下文件:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. 现在,无论何时您希望选择python3.x,都可以

    source $HOME/python_versions/env_python3x.bash

    进入virtualenv

  6. 在virtualenv中,使用以下命令安装您喜欢的python软件包:

    pip install --upgrade package_name
  7. 要退出virtualenv和python版本,只需键入“ deactivate”


0

我们在Mac和Ubuntu上放置了很多python版本,这是我的建议。

  1. 保持系统python不受干扰:永远不要使用它。

  2. 如果您只需要一个主要的python发行版,请从免费的角度下载并安装Canopy。安装后,选择“设置为我的系统python”,然后可以从Canopy的GUI软件包管理器安装软件包。

    • Canopy也可以pip通过PyPi软件包管理器命令立即使用,该命令可让您安装软件包(例如pip install python-twitter
  3. 如果您打算使用虚拟环境(即您正在开发python程序,并希望为每个程序创建专用的干净python环境,并且可以轻松在它们之间进行切换),那么我建议使用Anaconda over Canopy,因为它是虚拟环境管理器工具。这会让你

0

en

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

每个项目的使用

在上一节中,我们了解了如何在全局设置中使用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上测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.