在安裝Python包的過程當中,常常涉及到distutils、setuptools、distribute、setup.py、easy_install、easy_install和pip等等。忽然對Python的包管理凌亂了,這些工具關係是什麼,應該怎麼去選擇使用?html
下面就簡單介紹下Python包管理相關的一些內容。python
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部分。工具
setuptools 是對 distutils 的加強,尤爲是引入了包依賴管理。咱們能夠經過ez_setup.py來安裝setuptools。優化
至於distribute,它是setuptools的一個分支版本。分支的緣由是有一部分開發者認爲 setuptools 開發太慢。但如今,distribute 又合併回了 setuptools 中,因此能夠認爲它們是同一個東西。ui
前面看到setup.py能夠建立一個壓縮包,而setuptools使用了一種新的文件格式(.egg),能夠爲Python包建立 egg文件。setuptools 能夠識別.egg文件,並解析、安裝它。url
首先,不推薦使用,由於只能安裝不能卸載
當安裝好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的一個工具,方便了包的安裝和升級
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
pip install xxx --proxy=http://username:password@host:port
有時在安裝python包時會提示pip版本太低:
這時須要升級pip版本,執行以下命令
pip install --upgrade pip -vvv
說到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
主要用於解決多版本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版本
2012年發佈的跨平臺包管理軟件conda,是在數據分析界和Numpy和Scipy同樣受歡迎的python工具。可是普通程序員平時只是會使用conda安裝一些第三方包, 對它從哪裏來,它是什麼,和它要到哪裏去所知甚少。今天咱們就要講一下關於conda和anaconda不可不知的誤解和事實——conda必知必會的那些事實。
事實: Conda是一個包管理器;Anaconda纔是一個python發行版。雖然conda是用Anaconda打包的,可是它們兩個的目標是徹底不一樣的。
軟件發行版是在系統上提早編譯和配置好的軟件包集合, 裝好了後就能夠直接用。包管理器是自動化軟件安裝,更新,卸載的一種工具。Conda,有命令」conda install」, 「conda update」, 「conda remove」, 因此很明顯, conda是包管理器。
再來講說, Anaconda 和 Miniconda. Anaconda發行版會預裝不少pydata生態圈裏的軟件,而Miniconda是最小的conda安裝環境, 一個乾淨的conda環境。
可是,conda和Anaconda沒有必然關係, 你能夠不安裝Anaconda的同時, 使用conda安裝和管理軟件。
事實:Conda是一個通用的包管理器,當初設計來管理任何語言的包。因此用來管理python包固然也是綽綽有餘。
$ conda search –canonical | grep -v ‘py\d\d’
這句命令能夠幫你找出不是 pip和virtualenv能夠管理的python包,而conda能夠管理
事實:Conda 和 pip 目標並不相同,只有小部分子集有交集有競爭關係:好比python包的安裝和環境隔離。
一句話就能夠看出區別:
pip能夠容許你在任何環境中安裝python包,而conda容許你在conda環境中安裝任何語言包(包括c語言或者python)。
若是咱們只是關注python包安裝,conda和pip也是爲不一樣用戶和不一樣目標定製的。若是你想在一個已有系統快速管理python包,那你應該選擇pip,由於conda應該在conda環境中使用,而pip鼓勵在任何環境中使用 。而若是,你想要讓許多依賴庫一塊兒很好地工做(好比數據分析中的Numpy,scipy,Matplotlib等等)那你就應該使用conda,conda很好地整合了包之間的互相依賴。
事實:Conda做者多年來用python標準創造conda,只有在很是清晰合理的時候,才使用其餘工具。
你可能會問,我相信conda是遵循python標準的,可是它們爲何恰恰要撇開pip本身去造一套包管理器呢?爲何他們不直接去pip團隊貢獻想法呢?
事實上,一開始conda那夥人是想在pip社區貢獻想法和代碼的,可是像numpy,scipy這樣對底層c庫有複雜依賴的包管理需求,真的很少,因此社區不接受這樣的不常有的需求。因此,他們只能本身去造conda包管理器了。
事實上:你能夠在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
事實:wheels只是解決了conda試圖克服的許多困難中的一個, conda二進制編排仍是有不少wheels沒有的優點
wheels和conda都解決了預編譯的代碼安裝問題(不只僅是源代碼安裝)。可是wheel沒有conda的依賴處理能力,wheels只能跟蹤python代碼的依賴關係,conda能夠跟蹤不少c代碼的依賴關係,這爲許多用numpy和scipy作科學計算優化的科學家省了很多心。
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吧,這是徹底開源的。
事實: 雖然conda默認渠道沒有徹底開源,可是有一個社區牽頭的conda-forge,它會推進conda的包和發行版徹底開源。
事實: conda沒有和Continuum Analytics公司有不少牽扯;公司爲社區免費提供支持服務,全部軟件都有負責人,而不是公司全權負責。
事實: pip 和 conda 是爲不一樣目的存在的,咱們應該更加關注怎麼同時用好這兩個工具,而不是隻用一個