Python安装与版本管理

0.043字数 2214阅读 61456

Python为主流开发语言, 用python 开发的程序越来越多。 方便的是大多linux系统里面都默认集成了python, 开发可以随时随地开始。然而有部分发行版自带的python版本偏低,因此我我们需要手动来安装较新的版本。

以CentOS 6.x版本为例,自带的python版本为2.6.x的,假如需要使用2.7版本的,需要手动编译安装。

1. 手动安装python

1.1 编译安装Python 2.7

$ wget --no-check-certificate https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
$ tar xvf Python-2.7.11.tgz
$ cd Python-2.7.11
$ ./configure --prefix=/usr/local/python27
$ make
$ make install
$ mv /usr/bin/python /usr/bin/python26
$ ln -s /usr/local/python27/bin/python /usr/bin/python
$ python -V          # 查看版本

1.2 解决YUM无法使用的问题

CentOS系统下的YUM依赖于系统自带的python2.6版本,安装高版本python后会导致YUM无法使用,此时需要修改下YUM的默认python配置版本。

$ vim /usr/bin/yum
#!/usr/bin/python26       # 首行#!/usr/bin/python 替换为老版本python

CentOS 5.x的Python版本为2.4.x;CnetOS 6.x的Python版本为2.6.x;CnetOS 7.x的Python版本为2.7.x


此时我们才算真正安装完高版本的python,然而python的强大在于有许多优秀的第三方库可供使用。对于众多第三方库的安装与管理,python提供了一个类似YUM功能的包管理器PIP。

2. 包管理器Pip

2.1 安装

使用包管理软件安装

  • CentOS/RHEL
# 配置epel repo
$ sudo yum install python-pip
  • Ubuntu
$ sudo apt-get install python-pip

pip官方安装脚本

$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ python get-pip.py

pip编译安装

  • 安装setuptools
$ wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
$ tar zxvf setuptools-0.6c11.tar.gz
$ cd setuptools-0.6c11
$ python setup.py build
$ python setup.py install
  • 安装pip
$ wget https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#md5=01026f87978932060cc86c1dc527903e
$ tar zxvf pip-1.5.6.tar.gz
$ cd pip-1.5.6
$ python setup.py build
$ python setup.py install
  • 加载环境变量
$ vim /etc/profile/py27.sh
export PATH=/usr/local/python27/bin:$PATH
$ . /etc/profile/py27.sh

2.2 pip常用命令

$ pip install Package             # 安装模块包
$ pip list                        # 列出已安装的包
$ pip list --outdated             # 查看哪些软件需要更新
$ pip show --files Package        # 查看安装包时安装了哪些文件
$ pip show --files Package        # 查看那些软件需要更新
$ pip uninstall Package           # 卸载软件包
$ pip search Package              # 搜索软件包
$ pip install --upgrade/-U Package        # 升级软件包

2.3 pip示例

1.安装具体版本软件

$ pip install Package            # latest version
$ pip install Package==1.0.4     # specific version
$ pip install Package>=1.0.4'     # minimum version

2.Requirements文件安装依赖软件

Requirements文件 一般记录的是依赖软件列表,通过pip可以一次性安装依赖软件包:

$ pip freeze > requirements.txt        # 导出
$ pip install -r requirements.txt         # 安装

3.查看软件包信息

$ pip show pip
---
Name: pip
Version: 1.4.1
Location: /Library/Python/2.7/site-packages/pip-1.4.1-py2.7.egg
Requires:

$ pip show pyopencl
---
Name: pyopencl
Version: 2014.1
Location: /Library/Python/2.7/site-packages
Requires: pytools, pytest, decorator

4.升级软件包

$ pip install -U requests         # pip install --upgrade requests
Downloading/unpacking requests from https://pypi.python.org/packages/2.7/r/requests/requests-2.8.1-py2.py3-none-any.whl#md5=46f1d621daa3ab38958a42f51478b1ee
  Downloading requests-2.8.1-py2.py3-none-any.whl (497kB): 497kB downloaded
Installing collected packages: requests
  Found existing installation: requests 2.2.1
    Not uninstalling requests at /usr/lib/python2.7/dist-packages, owned by OS
Successfully installed requests

5.搜索

$ pip search bs4
bs4           - This package is used for a typo squatting experiment for my
                bachelors thesis. For more information, please visit http
                ://svs-repo.informatik.uni-hamburg.de/
zhihu-py3     - Zhihu UNOFFICIAL API library in python3, with help of bs4,
                lxml, requests and html2text.

2.4 使用第三方源

基于某些原因,访问国外站点的速度较慢,可以把镜像源切换至国内,加快下载速度。

第三方源:

  • 豆瓣:http://pypi.douban.com/simple
  • V2EX:http://pypi.v2ex.com/simple
  • 清华大学:http://mirrors.tuna.tsinghua.edu.cn/pypi/simple
  • 华中理工大学:http://pypi.hustunique.com/
  • 山东理工大学:http://pypi.sdutlinux.org/
  • 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/

使用镜像源很简单:

  • 可以在命令行用-i指定
pip install -i http://<mirror>/simple <package>
e.g.
$ [sudo] pip install -i http://pypi.douban.com/simple/ flask
  • 修改配置文件

    • Linux: $HOME/.pip/pip.conf
    • Windows: %HOMEPATH%\pip\pip.ini

    默认情况下$HOME目录的.pip目录是不存在的,需要手动创建

以豆瓣源为例

$ mkdir $HOME/.pip
$ cat >> $HOME/.pip/pip.conf << EOF
[global]
index-url = https://pypi.douban.com/simple
EOF

这样在使用pip来安装时,会默认调用更换源的镜像。

2.5 pip命令自动补全

对于Bash

$ pip completion --bash >> ~/.profile
$ . ~/.profile

对于zsh

$ pip completion --zsh >> ~/.zprofile
$ . ~/.profile

加载此配置文件后,则pip命令支持自动补全功能.


假如我们需要在一个系统下拥有多个python开发环境,此时我们就需要virtualenv。

virtualenv提供了一种功能,就是将一个目录建立为一个虚拟的python环境,这样的话,用户可以建立多个虚拟环境,每个环境里面的python版本可以是不同的,也可以是相同的,而且环境之间相互独立。

3. 虚拟沙盒virtualenv

virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题。

3.1 安装

virtualenv也是python的一个第三方库,因此可以用pip安装,当然也可以选择编译安装或YUM安装(EPEL源)。

pip安装方式

$ [sudo] pip install virtualenv

安装最新开发版

$ [sudo] pip install https://github.com/pypa/virtualenv/tarball/develop

源码安装

$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-X.X.tar.gz
$ tar xvfz virtualenv-X.X.tar.gz
$ cd virtualenv-X.X
$ [sudo] python setup.py install

yum安装方式

$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
$ yum clean all
$ yum makecache
$ yum install python-virtualenv

3.2 使用方法

1.创建虚拟环境

$ virtualenv venv

该操作会创建env/lib/pythonX.X/site-packages目录和env/bin/python,前者用来存放要安装的模块,后者就是隔离环境的Python解释器。 在virtualenv环境下使用此解释器(包括以 #!/path/to/ENV/bin/python 开头的脚本)时,使用的都是隔离环境下的模块。

该操作还在隔离环境下安装了Setuptoolsdistribute。要用Distribue取代setuptools的话,只要运行:

$ python virtualenv.py --distribute venv

如果你的系统里安装有不同版本的python,可以使用--python参数指定虚拟环境的python版本:

$ virtualenv --python=/path/to/python venv
或
$ virtualenv -p /path/to/python venv

默认情况下虚拟环境不会依赖系统环境的global site-packages。如果想依赖系统环境的第三方软件包,可以使用参数--system-site-packages

$ virtualenv --system-site-packages venv

2.激活虚拟环境

$ source venv/bin/activate
(venv) $

3.退出虚拟环境

$ deactivate

4.生成可打包环境

某些特殊需求下,可能没有网络, 我们期望直接打包一个venv, 可以解压后直接使用, 这时候可以使用virtualenv -relocatable指令将venv修改为可更改位置的venv

$ virtualenv --relocatable venv

pip用于python第三方包的安装管理,virtualenv用于隔离python环境,当我们需要用到多个版本的时候,可以用多个隔离环境。但是,有牛人写了个pyenv,它可以用来便捷的管理python的版本。

4. 版本管理器pyenv

pyenv是一个能简易地在多个Python版本中进行切换的工具,它简单而优雅。

它的美好之处在于,他并没有使用将不同的$PATH植入不同的shell这种高耦合的工作方式,而是简单地在$PATH的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin
所有对Python可执行文件的查找都会首先被这个shims路径截获,从而架空了后面的系统路径。

pyenv有以下功能:

  • 进行全局的Python版本切换
  • 为单个项目提供对应的Python版本
  • 使用环境变量能让你重写Python版本
  • 能在同一时间在不同版本间进行命令搜索

拥有以下特点:

  • 只依赖Python本身
  • 将目录添加进$PATH即可使用
  • 能够进行virtualenv管理

4.1 pyenv安装

安装依赖

  • CentOS
$ sudo yum -y install gcc gcc-c++ make git patch openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel bzip2-libs
  • Ubuntu
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev

安装pyenv

curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

配置环境变量

  • 官方提供的方法
$ echo -e '\npyenv' >>~/.bashrc
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
$ source ~/.bashrc
  • 也可以基于环境变量管理的方法
$ vim /etc/profile.d/pyenv.sh
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
$ . /etc/profile.d/pyenv.sh

重新载入profile之后,你就可以开始使用你的pyenv了,使用pyenv-installer安装的pyenv,会帮助我们安装几个有用的插件,其中,最常用的有:

  • pyenv-virtualenv 用于整合virtualenv
  • pyenv-pip-rehash 用于使用pip安装包之后自动执行rehash
  • pyenv-update 用于升级pyenv

4.2 pyenv常用命令

$ pyenv version        # 查看当前系统使用的python版本
$ pyenv versions        # 查看当前系统拥有的python版本
$ pyenv install 3.4.1          # 安装3.4.1,可使用-v参数查看详细输出
$ pyenv uninstall 3.4.1         # 卸载
$ pyenv local 3.4.1     # local仅对当前目录及子目录生效,告诉当前目录使用版本2.7.5,
$ pyenv global          # 告诉全局环境使用某个版本,为了不破坏系统环境,不建议使用global设置全局版本
$ pyenv rehash          # 重建环境变量,每当你增删 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令

4.3 pyenv示例

1.安装python3.4.1

$ pyenv install 3.4.1
Downloading Python-3.4.1.tgz...
-> http://magedu-python.qiniudn.com/pythons/8d007e3ef80b128a292be101201e75dec5480e5632e994771e7c231d17720b66
Installing Python-3.4.1...
patching file ./Lib/ssl.py
patching file ./Modules/_ssl.c
Hunk #1 succeeded at 2014 (offset -2 lines).
Hunk #2 succeeded at 4066 (offset -7 lines).
Installed Python-3.4.1 to /home/will/.pyenv/versions/3.4.1

$ pyenv version
system (set by /home/will/test/.python-version)
$ pyenv versions
* system (set by /home/will/test/.python-version)
  3.4.1
  3.4.2

*表示当前的python版本;

$ ll ~/.pyenv/cache
-rw-rw-r-- 1 will will 19113124 Feb 25 18:02 Python-3.4.1.tar.gz

这里下载使用了别人的国内镜像http://magedu-python.qiniudn.com/pythons,由于没有更新,不做推荐。

下载前更改PYTHON_BUILD_MIRROR_URL环境变量即可:
export PYTHON_BUILD_MIRROR_URL='http://magedu-python.qiniudn.com/pythons'

由于安装包下载在~/.pyenv/cache后,不会重复下载。因此当速度慢时也可手动下载后放置在目录下。

使用pyenv安装python会自动安装pip

2.切换版本

$ pyenv local 3.4.1
$ pyenv version
3.4.1 (set by /home/will/test/.python-version)

$ mkdir will
$ cd will/
$ python -V
Python 3.4.1

当切换本地目录的python版本后,对其目录及子目录生效

3.virtualenv

pyenv通过插件,可以很好的和virtualenv一起工作,通过整合virtualenv,pyenv实现了真正意义上的环境隔离,每个项目都相当于使用一个单独的解释器。

virtualenv的一般用法如下:

pyenv virtualenv [-f|--force] [-u|--upgrade] [VIRTUALENV_OPTIONS] <version> <virtualenv-name>
  • -f 表示强制的(假如虚拟环境已存在,将会覆盖这个虚拟环境)
  • -u 表示upgrade,用于修改已经存在的虚拟环境的Python版本
  • VIRTUALENV_OPTIONS 是传递给virtualenv的选项,可以通过virtualenv的帮助获取选项的含义
  • version 表示Python版本
  • virtualenv-name 指定虚拟环境名
$ pyenv virtualenv 3.4.1 venv
Ignoring indexes: https://pypi.python.org/simple/
Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/will/.pyenv/versions/3.4.1/envs/venv/lib/python3.4/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /home/will/.pyenv/versions/3.4.1/envs/venv/lib/python3.4/site-packages
Cleaning up...

$ pyenv versions
  system
* 3.4.1 (set by /home/will/test/.python-version)
  3.4.1/envs/venv
  3.4.2
  venv

# 此时会看到一个venv跟3.4.1/envs/venv,查看可知venv是后者的一个软链接
$ pyenv which python
/home/will/.pyenv/versions/3.4.1/bin/python
$ ll /home/will/.pyenv/versions
total 8
drwxr-xr-x 7 will will 4096 Feb 25 18:13 3.4.1
drwxr-xr-x 7 will will 4096 Feb 25 16:02 3.4.2
lrwxrwxrwx 1 will will   42 Feb 25 18:13 venv -> /home/will/.pyenv/versions/3.4.1/envs/venv

# 此时切换环境
$ pyenv local venv
pyenv-virtualenv: deactivate
pyenv-virtualenv: activate venv
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(venv) $
(venv) $ cd -
pyenv-virtualenv: deactivate 3.4.1/envs/venv
$

$ cd test/
pyenv-virtualenv: deactivate
pyenv-virtualenv: activate venv
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(venv) $

plug的virtual不用手动去激活环境;当把本地目录与环境相关联起来后,将自动激活虚拟环境,离开目录时自动退出虚拟环境

4.删除虚拟环境跟python版本

$ pyenv local system
$ pyenv virtualenv-delete venv
pyenv-virtualenv: remove /home/will/.pyenv/versions/3.4.1/envs/venv? y
$ pyenv versions
* system (set by /home/will/test/.python-version)
  3.4.1
  3.4.2

$ pyenv uninstall 3.4.1
pyenv: remove /home/will/.pyenv/versions/3.4.1? y
$ pyenv versions
* system (set by /home/will/test/.python-version)
  3.4.2

这样,管理python版本和使用python变得更为简便。

5. 个人经验

2017-04-18

此笔记是记录初学python时,python相关工具的理解和常用实例,Windows,Linux,OS X系统下均有涉及。时过境迁,目前觉得较好的方案是使用vagrant构建系统开发环境,pyenv管理python环境,pip管理python包,vagrant便于移植环境到不同的操作系统,易保持开发环境的统一性。

关于vagrant可参考 使用 Vagrant 打造跨平台开发环境

6. 参考博文

推荐阅读更多精彩内容