不同Python版本的apt-get安装

19
我有一个默认安装了Python 2.6的Ubuntu 10.04系统。我已经安装了Python 2.7。
当我想要使用以下命令安装Python包时:
apt-get python-<package> 

它被安装到了Python 2.6。我如何使其安装到Python 2.7?有什么选项吗?

我看过这个,但在我的操作系统中找不到这样的目录。我考虑使用easy_install-2.7,但不是所有的包都被支持。例如python-torctl

我更感兴趣的是将Python 2.7与apt-get install绑定。


这样类似的编程问题更有可能在 http://askubuntu.com 上得到答案。 - Matt
尝试使用“apt-cache search <query> | more”。这样可以让您更慢地滚动它们并查看。 - Matt
仍然无法从 apt-cache search python | more 获取任何有用的信息,但我已经通过 easy_install-2.7 安装了其他软件包,但其他软件包存在一些问题。 - torayeff
你无法获取任何有用的信息,因为Ubuntu默认仓库中没有Python2.7软件包。 - dm03514
1
在Ask Ubuntu上发布了交叉帖子:http://askubuntu.com/questions/148540/apt-get-install-for-different-python-versions?atw=1 - jrg
显示剩余2条评论
3个回答

11
Python有自己的软件包管理工具,与Linux发行版(包括Ubuntu)提供的工具并行。仓库是Pypi - Python Package Index,可以使用pip或easy_install脚本安装软件包,后者是Python的setuptools软件包的一部分。
通常情况下,不应同时使用通过pip/setuptools安装的软件包和通过apt-get、yum、urpmi等方式提供的发行版软件包,因为它们可能会产生冲突。
因此,处理这个问题中一个较少出错的方法是在系统中安装单独的Python版本——保留系统附带的Python用于系统脚本等——在该Python上,只使用由您的软件包管理器安装的软件包。然后,在其他版本的Python(甚至相同版本的Python)上安装“virtualenv”——在这些其他安装中,只使用pip/setuptools安装软件包。
即使选择大胆地不使用virtualenvs,将另一个Python版本安装在与系统Python相同的前缀(/usr,甚至/usr/local)上也会导致混淆的错误和冲突。
请注意,Debian和Ubuntu系统想出了一种在/usr中运行平行官方Python的方法,并且让apt-get同时安装Python软件包到两个Python版本中。这基本上是有效的,但它们会干扰Python的默认目录层次结构,有些应用程序无法以这种方式使用Python。(在Debian或Ubuntu中查找模块文件本身也很混乱)。因此,即使您的系统在apt-get中有多个Python版本可用,上述方法仍适用作为推荐。
简而言之,一旦您编译了所需的Python版本,请执行以下操作: 1.使用系统的软件包管理器安装"python-setuptools"和"python-virtualenv"(不确定这是否是实际的软件包名称)。 2.使用virtualenv从中创建环境,您将使用不同的Python版本。 3.激活您的虚拟环境,并在其中使用pip安装Python软件包。
Virtualenv确实具有“--help”开关来帮助您,但您基本上需要执行以下操作:
$ virtualenv -p <path-to-python-interpreter>  <environment-dir>
$ source <environment-dir>/bin/activate

现在你已经完成了所有用Python编写的东西,都会“看到”虚拟环境中的解释器,这是由于设置的环境变量。


1
当你为交叉编译设置了Debian,并且Python不仅有不同的版本,甚至还有不同的架构时,事情可能会变得更加糟糕。 - MSalters

6

即使我已经安装了python2.7,我仍然尝试重新安装,问题并不在于python2.7的安装,而是在于使用apt-get install安装包时,默认会安装到python2.6上。例如,apt-get install python-torctl会将其安装到python2.6上,我不能在python2.7中使用它,我该怎么办? - torayeff
@torayeff:apt-get 管理它自己安装的 Python 版本的软件包。除非你使用 apt-get 安装了该版本,否则无法将其用于其他版本。 - Fred Foo

4

Pyenv

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__)'

提供:

/home/ciro/.pyenv/versions/3.8.0/lib/python3.8/site-packages/cowsay/__init__.py

并且:

which cowsay

提供:

/home/ciro/.pyenv/shims/cowsay

并且:

which python

提供:

/home/ciro/.pyenv/shims/python

按项目使用

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

但是,通常您希望基于每个项目来设置特定的Python版本和软件包版本。以下是如何实现。

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

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

pyenv local 3.8.0

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

现在让我们为我们的项目本地安装一个软件包:TODO:似乎没有很好的方法:Pyenv choose virtualenv directory

现在,当有人想要使用你的项目时,他们会执行以下操作:

pyenv local

这会设置正确的 Python 版本。

相关线程:

在 Ubuntu 18.04,pyenv 1.2.15 上测试通过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接