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目录是不存在的,需要手动创建
- Linux:
以豆瓣源为例
$ 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 开头的脚本)时,使用的都是隔离环境下的模块。
该操作还在隔离环境下安装了Setuptools
或distribute
。要用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 打造跨平台开发环境