Python包管理工具和多版本環境管理

 1. Python包管理工具

在安裝Python包的過程當中,常常涉及到distutils、setuptools、distribute、setup.py、easy_install、easy_install和pip等等。忽然對Python的包管理凌亂了,這些工具關係是什麼,應該怎麼去選擇使用?html

下面就簡單介紹下Python包管理相關的一些內容。python

1.1 distutils

distutils 是 python 標準庫的一部分,這個庫的目的是爲開發者提供一種方便的打包方式, 同時爲使用者提供方便的安裝方式。咱們常用的setup.py就是基於distutils實現的,而後經過setup.py就能夠進行打包或者安裝了。linux

看一個簡單的例子,找一個目錄建立兩個文件foo.py和setup.py,內容以下:程序員

1 # foo.py
2 def func():
3     print 'hello world!'
1 # setup.py
2 from distutils.core import setup
3 setup(
4     name='foo',
5     version='1.0',
6     author='winter',
7     author_email='winter@126.com',
8     py_modules=['foo'],
9 )

而後,在該目錄中運行以下命令:windows

會建立dist文件和一個foo-1.0.zip壓縮文件,使用者就能夠解壓縮這個包,而後執行python  setup.py install進行安裝,而後就可使用這個foo模塊了。svn

關於更過如何編寫setup.py的內容,請自行參閱Python官方文檔中的setupscript部分工具

1.2 setuptools 和 distribute

setuptools 是對 distutils 的加強,尤爲是引入了包依賴管理。咱們能夠經過ez_setup.py來安裝setuptools。優化

至於distribute,它是setuptools的一個分支版本。分支的緣由是有一部分開發者認爲 setuptools 開發太慢。但如今,distribute 又合併回了 setuptools 中,因此能夠認爲它們是同一個東西。ui

前面看到setup.py能夠建立一個壓縮包,而setuptools使用了一種新的文件格式(.egg),能夠爲Python包建立 egg文件。setuptools 能夠識別.egg文件,並解析、安裝它。url

1.3 easy_install

首先,不推薦使用,由於只能安裝不能卸載

當安裝好setuptools/distribute以後,咱們就能夠直接使用easy_install這個工具了:

1) 從PyPI上安裝一個包:當使用 easy_install package 命令後,easy_install 能夠自動從 PyPI 上下載相關的包,並完成安裝,升級

2) 下載一個包安裝:經過 easy_install package.tgz 命令能夠安裝一個已經下載的包

3) 安裝egg文件:經過 easy_install package.egg 能夠安裝一個egg格式的文件

根據上面的分析,能夠看到setuptools/distribute和easy_install之間的關係:

a)setuptools/distribute 都擴展了 distutils,提供了更多的功能

b)easy_install是基於setuptools/distribute的一個工具,方便了包的安裝和升級

1.4 PIP

pip是目前最流行的Python包管理工具,它被看成easy_install的替代品,可是仍有大量的功能創建在setuptools之上。

easy_install 有不少不足:安裝事務是非原子操做,只支持 svn,沒有提供卸載命令, 安裝一系列包時須要寫腳本。pip 解決了以上問題,已經成爲新的事實標準。

經過pip –help查看幫助文檔,cmd下直接運行pip命令;

若是你對yum和apt-get比較熟悉,那麼pip的命令會讓你有種似曾相識的感受;

pip經常使用命令集合:

1)安裝包

pip install SomePackage        #從PyPI安裝PyPI上最新的軟件包
pip install SomePackage==1.0.4    #安裝指定版本的軟件包
pip install 'SomePackage>=1.0.4'    #安裝版本不能低於1.0.4
pip install ./downloads/SomePackage-1.0.4.tar.gz    #本地安裝
pip install http://my.package.repo/SomePackage-1.0.4.zip    #從網上某個連接安裝

還有一個根據依賴文件安裝:

pip freeze > requirements.txt        # 使用pip導出依賴文件列表
pip install -r requirements.txt        # 根據依賴文件列表,自動安裝對應的軟件包

2)升級包

pip list --outdated    #查看可升級軟件包
pip install --upgrade SomePackage    #升級軟件包

3)卸載包

pip uninstall SomePackage

4)查詢包

pip list    #查看已安裝軟件包
pip show --files SomePackage    #查看軟件包安裝了哪些文件及路徑等信息
pip search 「query」    #不知道要安裝的軟件包的具體名稱,使用search命令進行查詢,會列出相關的包

5)配置鏡像源

pip的鏡像地址默認在國外,速度比較慢,能夠設置爲國內鏡像源

a)linux

修改 ~/.pip/pip.conf (Linux/Mac) 

b)windows

C:\Users\當前用戶名\pip\pip.ini(沒有pip.ini就建立一個)

國內的能夠配置成清華的鏡像源,配置爲:

[global]  
index-url = https://pypi.tuna.tsinghua.edu.cn/simple  

6)pip代理設置

pip install xxx --proxy=http://username:password@host:port

7)升級pip

 有時在安裝python包時會提示pip版本太低:

這時須要升級pip版本,執行以下命令

 pip install --upgrade pip -vvv

1.5 Conda包管理

說到conda,就必需要說到anaconda了;

Anaconda是一個用於科學計算的Python發行版,支持 Linux, Mac, Windows系統,擁有大量的用於科學計算的第三方庫;

conda是anaconda的包管理和環境管理工具, 是 pip 和 vitualenv 的組合。強烈推薦

anaconda解決了Python開發者的兩大痛點:

1)提供包管理,功能相似於 pip,Windows 平臺安裝第三方包常常失敗的場景得以解決。

2)提供虛擬環境管理,功能相似於 virtualenv,解決了多版本Python並存問題。

安裝時,會發現有兩個不一樣版本的Anaconda,分別對應Python 2.7和Python 3.5,兩個版本其實除了這點區別外其餘都同樣。後面咱們會看到,安裝哪一個版本並不本質,由於經過環境管理,咱們能夠很方便地切換運行時的Python版本。

經過conda –help命令查看幫助

1)安裝包

conda install -n python34 somepackage # -n 安裝到指定環境;若是不用-n指定環境名稱,則被安裝在當前活躍環境;-c 指定經過某個channel安裝

2)升級包

提示:pip只是一個包管理器,因此它不能爲你管理環境。pip甚至不能升級python,由於它不像conda同樣把python當作包來處理。可是它能夠安裝一些conda安裝不了的包。

conda能夠用來升級python,anaconda,conda,有木有感受很強大

conda update -n python34 xxx        # 更新package
conda update conda    # 更新conda,保持conda最新
conda update anaconda    # 更新anaconda
conda update python    # 更新python

3)刪除包

conda remove -n python34 xxx

4)查詢包

conda install xxxx    # 安裝xxxx
conda list        # 查看當前環境下已安裝的包
conda list -n python34    # 查看某個指定環境的已安裝包
conda search xxx        # 查找package信息

5)修改鏡像源

a)命令方式

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/        # 添加Anaconda的TUNA鏡像,TUNA的help中鏡像地址加有引號,須要去掉
conda config --set show_channel_urls yes    # 設置搜索時顯示通道地址

b)配置文件方式

修改 ~/.condarc (Linux/Mac) 或 C:\Users\當前用戶名.condarc (Windows) 配置:

channels:
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
 - defaults
show_channel_urls: yes

2. conda環境管理

2.1 conda多環境設置

主要用於解決多版本python共存的問題,同時針對不一樣的項目建立獨立的開發環境;除了conda,其餘主流的還有virtualenv和pyenv,可是我仍是喜歡用conda

1)經過conda命令管理

# 建立一個名爲python34的環境,指定Python版本是3.4(不用管是3.4.x,conda會爲咱們自動尋找3.4.x中的最新版本),新的開發環境會被默認安裝在目錄~/anaconda/envs下。你能夠經過-h指定一個其餘的路徑;若是咱們沒有指定安裝python的版本,conda會安裝咱們最初安裝conda時所裝的那個版本的python。
conda create –name python34 python=3.4  
# 安裝好後,使用activate激活某個環境  
activate python34 # for Windows  
source activate python34 # for Linux & Mac  
# 激活後,會發現terminal輸入的地方多了python34的字樣,實際上,此時系統作的事情就是把默認2.7環境從PATH中去除,再把3.4對應的命令加入PATH  
# 此時,再次輸入  
python--version  
# 能夠獲得`Python 3.4.5 :: Anaconda 4.1.1 (64-bit)`,即系統已經切換到了3.4的環境  
# 若是想返回默認的python 2.7環境,運行  
deactivate python34 # for Windows  
source deactivate python34 # for Linux & Mac  
# 複製一個環境  
conda create -n pyhon34 --clone python34clone  
# 刪除一個已有的環境  
conda remove –name python34 --all  
# 查看已安裝的環境,當前被激活的環境會顯示有一個星號或者括號
conda info -e  

 activate和deactivate效果以下:

2)pycharm

很是簡單

設置環境名字,存放的位置以及環境安裝的python版本

2.2 偷偷盜取一篇很牛逼的博文

關於conda和anaconda不可不知的誤解和事實——conda必知必會

2012年發佈的跨平臺包管理軟件conda,是在數據分析界和Numpy和Scipy同樣受歡迎的python工具。可是普通程序員平時只是會使用conda安裝一些第三方包, 對它從哪裏來,它是什麼,和它要到哪裏去所知甚少。今天咱們就要講一下關於conda和anaconda不可不知的誤解和事實——conda必知必會的那些事實。

誤解 #1:Conda是python的一個發行版,不是一個包管理器。

事實: Conda是一個包管理器;Anaconda纔是一個python發行版。雖然conda是用Anaconda打包的,可是它們兩個的目標是徹底不一樣的。

軟件發行版是在系統上提早編譯和配置好的軟件包集合, 裝好了後就能夠直接用。包管理器是自動化軟件安裝,更新,卸載的一種工具。Conda,有命令」conda install」, 「conda update」, 「conda remove」, 因此很明顯, conda是包管理器。

再來講說, Anaconda 和 Miniconda. Anaconda發行版會預裝不少pydata生態圈裏的軟件,而Miniconda是最小的conda安裝環境, 一個乾淨的conda環境。

可是,conda和Anaconda沒有必然關係, 你能夠不安裝Anaconda的同時, 使用conda安裝和管理軟件。

誤解 #2: Conda是一個python包管理器

事實:Conda是一個通用的包管理器,當初設計來管理任何語言的包。因此用來管理python包固然也是綽綽有餘。

$ conda search –canonical | grep -v ‘py\d\d’

這句命令能夠幫你找出不是 pip和virtualenv能夠管理的python包,而conda能夠管理

誤解 #3: Conda 和 pip 是直接競爭關係

事實:Conda pip 目標並不相同,只有小部分子集有交集有競爭關係:好比python包的安裝和環境隔離。 

一句話就能夠看出區別:

pip能夠容許你在任何環境中安裝python包,而conda容許你在conda環境中安裝任何語言包(包括c語言或者python)。

若是咱們只是關注python包安裝,conda和pip也是爲不一樣用戶和不一樣目標定製的。若是你想在一個已有系統快速管理python包,那你應該選擇pip,由於conda應該在conda環境中使用,而pip鼓勵在任何環境中使用 。而若是,你想要讓許多依賴庫一塊兒很好地工做(好比數據分析中的Numpy,scipy,Matplotlib等等)那你就應該使用conda,conda很好地整合了包之間的互相依賴。

誤解 #4: 使用conda首先是不負責任而且會引發分歧的

事實Conda做者多年來用python標準創造conda只有在很是清晰合理的時候才使用其餘工具。

你可能會問,我相信conda是遵循python標準的,可是它們爲何恰恰要撇開pip本身去造一套包管理器呢?爲何他們不直接去pip團隊貢獻想法呢?

事實上,一開始conda那夥人是想在pip社區貢獻想法和代碼的,可是像numpy,scipy這樣對底層c庫有複雜依賴的包管理需求,真的很少,因此社區不接受這樣的不常有的需求。因此,他們只能本身去造conda包管理器了。

誤解 #5: conda不能和virtualenv一塊兒使用,因此它對個人工做沒用

事實上你能夠在virtualenv環境下安裝conda可是最好用conda本身的環境工具這樣會和pip有更好的兼容性

你能夠在virtualenv裏面安裝conda:

$ virtualenv test_conda
$ source test_conda/bin/activate
$ pip install conda
$ conda install numpy

也能夠在conda中造虛擬環境:

$ conda create -n yourenvname python=x.x anaconda
$ source activate yourenvname

誤解 #6: 如今pip用wheels了,conda沒什麼用了

事實:wheels只是解決了conda試圖克服的許多困難中的一個, conda二進制編排仍是有不少wheels沒有的優點 

wheels和conda都解決了預編譯的代碼安裝問題(不只僅是源代碼安裝)。可是wheel沒有conda的依賴處理能力,wheels只能跟蹤python代碼的依賴關係,conda能夠跟蹤不少c代碼的依賴關係,這爲許多用numpy和scipy作科學計算優化的科學家省了很多心。

誤解 #7: conda不是開源的;它是被盈利公司掌控的,若是有一天公司想收費了,那你就得付錢

Reality: conda (the package manager and build system) is 100% open-source, and Anaconda (the distribution) is nearly there as well.

Anaconda和conda都是standard BSD license開源標準。若是你還不放心,用pip install conda吧,這是徹底開源的。

誤解 #8: Conda 軟件包自己都是閉源的吧?

事實: 雖然conda默認渠道沒有徹底開源,可是有一個社區牽頭的conda-forge,它會推進conda的包和發行版徹底開源。

誤解 #9: 可是,若是Continuum Analytics公司倒閉,conda就不會存活了吧 ?

事實: conda沒有和Continuum Analytics公司有不少牽扯;公司爲社區免費提供支持服務,全部軟件都有負責人,而不是公司全權負責。

誤解 #10: 每一個人都應該拋棄(conda | pip)去用(pip | conda) !

事實: pip conda 是爲不一樣目的存在的,咱們應該更加關注怎麼同時用好這兩個工具,而不是隻用一個

相關文章
相關標籤/搜索