Python為主流開發(fā)語言, 用python 開發(fā)的程序越來越多。 方便的是大多l(xiāng)inux系統(tǒng)里面都默認(rèn)集成了python, 開發(fā)可以隨時(shí)隨地開始。然而有部分發(fā)行版自帶的python版本偏低,因此我我們需要手動(dòng)來安裝較新的版本。
以CentOS 6.x版本為例,自帶的python版本為2.6.x的,假如需要使用2.7版本的,需要手動(dòng)編譯安裝。
1. 手動(dòng)安裝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系統(tǒng)下的YUM依賴于系統(tǒng)自帶的python2.6版本,安裝高版本python后會(huì)導(dǎo)致YUM無法使用,此時(shí)需要修改下YUM的默認(rèn)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
此時(shí)我們才算真正安裝完高版本的python,然而python的強(qiáng)大在于有許多優(yōu)秀的第三方庫可供使用。對(duì)于眾多第三方庫的安裝與管理,python提供了一個(gè)類似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
- 加載環(huán)境變量
$ 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 # 查看安裝包時(shí)安裝了哪些文件
$ pip show --files Package # 查看那些軟件需要更新
$ pip uninstall Package # 卸載軟件包
$ pip search Package # 搜索軟件包
$ pip install --upgrade/-U Package # 升級(jí)軟件包
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 # 導(dǎo)出
$ 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.升級(jí)軟件包
$ 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 使用第三方源
基于某些原因,訪問國(guó)外站點(diǎn)的速度較慢,可以把鏡像源切換至國(guó)內(nèi),加快下載速度。
第三方源:
- 豆瓣:
http://pypi.douban.com/simple - V2EX:
http://pypi.v2ex.com/simple - 清華大學(xué):
http://mirrors.tuna.tsinghua.edu.cn/pypi/simple - 華中理工大學(xué):
http://pypi.hustunique.com/ - 山東理工大學(xué):
http://pypi.sdutlinux.org/ - 中國(guó)科學(xué)技術(shù)大學(xué)
http://pypi.mirrors.ustc.edu.cn/
使用鏡像源很簡(jiǎn)單:
- 可以在命令行用-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
默認(rèn)情況下$HOME目錄的.pip目錄是不存在的,需要手動(dòng)創(chuàng)建
- Linux:
以豆瓣源為例
$ mkdir $HOME/.pip
$ cat >> $HOME/.pip/pip.conf << EOF
[global]
index-url = https://pypi.douban.com/simple
EOF
這樣在使用pip來安裝時(shí),會(huì)默認(rèn)調(diào)用更換源的鏡像。
2.5 pip命令自動(dòng)補(bǔ)全
對(duì)于Bash
$ pip completion --bash >> ~/.profile
$ . ~/.profile
對(duì)于zsh
$ pip completion --zsh >> ~/.zprofile
$ . ~/.profile
加載此配置文件后,則pip命令支持自動(dòng)補(bǔ)全功能.
假如我們需要在一個(gè)系統(tǒng)下?lián)碛卸鄠€(gè)python開發(fā)環(huán)境,此時(shí)我們就需要virtualenv。
virtualenv提供了一種功能,就是將一個(gè)目錄建立為一個(gè)虛擬的python環(huán)境,這樣的話,用戶可以建立多個(gè)虛擬環(huán)境,每個(gè)環(huán)境里面的python版本可以是不同的,也可以是相同的,而且環(huán)境之間相互獨(dú)立。
3. 虛擬沙盒virtualenv
virtualenv為應(yīng)用提供了隔離的Python運(yùn)行環(huán)境,解決了不同應(yīng)用間多版本的沖突問題。
3.1 安裝
virtualenv也是python的一個(gè)第三方庫,因此可以用pip安裝,當(dāng)然也可以選擇編譯安裝或YUM安裝(EPEL源)。
pip安裝方式
$ [sudo] pip install virtualenv
安裝最新開發(fā)版
$ [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.創(chuàng)建虛擬環(huán)境
$ virtualenv venv
該操作會(huì)創(chuàng)建env/lib/pythonX.X/site-packages目錄和env/bin/python,前者用來存放要安裝的模塊,后者就是隔離環(huán)境的Python解釋器。 在virtualenv環(huán)境下使用此解釋器(包括以 #!/path/to/ENV/bin/python 開頭的腳本)時(shí),使用的都是隔離環(huán)境下的模塊。
該操作還在隔離環(huán)境下安裝了Setuptools或distribute。要用Distribue取代setuptools的話,只要運(yùn)行:
$ python virtualenv.py --distribute venv
如果你的系統(tǒng)里安裝有不同版本的python,可以使用--python參數(shù)指定虛擬環(huán)境的python版本:
$ virtualenv --python=/path/to/python venv
或
$ virtualenv -p /path/to/python venv
默認(rèn)情況下虛擬環(huán)境不會(huì)依賴系統(tǒng)環(huán)境的global site-packages。如果想依賴系統(tǒng)環(huán)境的第三方軟件包,可以使用參數(shù)--system-site-packages。
$ virtualenv --system-site-packages venv
2.激活虛擬環(huán)境
$ source venv/bin/activate
(venv) $
3.退出虛擬環(huán)境
$ deactivate
4.生成可打包環(huán)境
某些特殊需求下,可能沒有網(wǎng)絡(luò), 我們期望直接打包一個(gè)venv, 可以解壓后直接使用, 這時(shí)候可以使用virtualenv -relocatable指令將venv修改為可更改位置的venv
$ virtualenv --relocatable venv
pip用于python第三方包的安裝管理,virtualenv用于隔離python環(huán)境,當(dāng)我們需要用到多個(gè)版本的時(shí)候,可以用多個(gè)隔離環(huán)境。但是,有牛人寫了個(gè)pyenv,它可以用來便捷的管理python的版本。
4. 版本管理器pyenv
pyenv是一個(gè)能簡(jiǎn)易地在多個(gè)Python版本中進(jìn)行切換的工具,它簡(jiǎn)單而優(yōu)雅。
它的美好之處在于,他并沒有使用將不同的$PATH植入不同的shell這種高耦合的工作方式,而是簡(jiǎn)單地在$PATH的最前面插入了一個(gè)墊片路徑(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。
所有對(duì)Python可執(zhí)行文件的查找都會(huì)首先被這個(gè)shims路徑截獲,從而架空了后面的系統(tǒng)路徑。
pyenv有以下功能:
- 進(jìn)行全局的Python版本切換
- 為單個(gè)項(xiàng)目提供對(duì)應(yīng)的Python版本
- 使用環(huán)境變量能讓你重寫Python版本
- 能在同一時(shí)間在不同版本間進(jìn)行命令搜索
擁有以下特點(diǎn):
- 只依賴Python本身
- 將目錄添加進(jìn)$PATH即可使用
- 能夠進(jìn)行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
配置環(huán)境變量
- 官方提供的方法
$ 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
- 也可以基于環(huán)境變量管理的方法
$ 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,會(huì)幫助我們安裝幾個(gè)有用的插件,其中,最常用的有:
-
pyenv-virtualenv用于整合virtualenv -
pyenv-pip-rehash用于使用pip安裝包之后自動(dòng)執(zhí)行rehash -
pyenv-update用于升級(jí)pyenv
4.2 pyenv常用命令
$ pyenv version # 查看當(dāng)前系統(tǒng)使用的python版本
$ pyenv versions # 查看當(dāng)前系統(tǒng)擁有的python版本
$ pyenv install 3.4.1 # 安裝3.4.1,可使用-v參數(shù)查看詳細(xì)輸出
$ pyenv uninstall 3.4.1 # 卸載
$ pyenv local 3.4.1 # local僅對(duì)當(dāng)前目錄及子目錄生效,告訴當(dāng)前目錄使用版本2.7.5,
$ pyenv global # 告訴全局環(huán)境使用某個(gè)版本,為了不破壞系統(tǒng)環(huán)境,不建議使用global設(shè)置全局版本
$ pyenv rehash # 重建環(huán)境變量,每當(dāng)你增刪 Python 版本或帶有可執(zhí)行文件的包(如 pip)以后,都應(yīng)該執(zhí)行一次本命令
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
*表示當(dāng)前的python版本;
$ ll ~/.pyenv/cache
-rw-rw-r-- 1 will will 19113124 Feb 25 18:02 Python-3.4.1.tar.gz
這里下載使用了別人的國(guó)內(nèi)鏡像
http://magedu-python.qiniudn.com/pythons,由于沒有更新,不做推薦。
下載前更改PYTHON_BUILD_MIRROR_URL環(huán)境變量即可:
export PYTHON_BUILD_MIRROR_URL='http://magedu-python.qiniudn.com/pythons'
由于安裝包下載在
~/.pyenv/cache后,不會(huì)重復(fù)下載。因此當(dāng)速度慢時(shí)也可手動(dòng)下載后放置在目錄下。使用pyenv安裝python會(huì)自動(dòng)安裝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
當(dāng)切換本地目錄的python版本后,對(duì)其目錄及子目錄生效
3.virtualenv
pyenv通過插件,可以很好的和virtualenv一起工作,通過整合virtualenv,pyenv實(shí)現(xiàn)了真正意義上的環(huán)境隔離,每個(gè)項(xiàng)目都相當(dāng)于使用一個(gè)單獨(dú)的解釋器。
virtualenv的一般用法如下:
pyenv virtualenv [-f|--force] [-u|--upgrade] [VIRTUALENV_OPTIONS] <version> <virtualenv-name>
-
-f表示強(qiáng)制的(假如虛擬環(huán)境已存在,將會(huì)覆蓋這個(gè)虛擬環(huán)境) -
-u表示upgrade,用于修改已經(jīng)存在的虛擬環(huán)境的Python版本 -
VIRTUALENV_OPTIONS是傳遞給virtualenv的選項(xiàng),可以通過virtualenv的幫助獲取選項(xiàng)的含義 -
version表示Python版本 -
virtualenv-name指定虛擬環(huán)境名
$ 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
# 此時(shí)會(huì)看到一個(gè)venv跟3.4.1/envs/venv,查看可知venv是后者的一個(gè)軟鏈接
$ 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
# 此時(shí)切換環(huán)境
$ 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不用手動(dòng)去激活環(huán)境;當(dāng)把本地目錄與環(huán)境相關(guān)聯(lián)起來后,將自動(dòng)激活虛擬環(huán)境,離開目錄時(shí)自動(dòng)退出虛擬環(huán)境
4.刪除虛擬環(huán)境跟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變得更為簡(jiǎn)便。
5. 個(gè)人經(jīng)驗(yàn)
2017-04-18
此筆記是記錄初學(xué)python時(shí),python相關(guān)工具的理解和常用實(shí)例,Windows,Linux,OS X系統(tǒng)下均有涉及。時(shí)過境遷,目前覺得較好的方案是使用vagrant構(gòu)建系統(tǒng)開發(fā)環(huán)境,pyenv管理python環(huán)境,pip管理python包,vagrant便于移植環(huán)境到不同的操作系統(tǒng),易保持開發(fā)環(huán)境的統(tǒng)一性。
關(guān)于vagrant可參考 使用 Vagrant 打造跨平臺(tái)開發(fā)環(huán)境