python人工智能方向第三方库_Python进阶-第三方库管理和虚拟环境
本文為《爬著學(xué)Python》系列第十三篇文章。
Python能在這幾年火起來,靠的不是網(wǎng)上一大片的爬蟲和服務(wù)器后端知識(shí)的應(yīng)用(本專題就是這樣的,這么說真的好嗎?不過我們總得認(rèn)清事實(shí)是吧。),靠的是Python搭上了大數(shù)據(jù)和人工智能的風(fēng)。而Python之所以能很好地適應(yīng)人工智能方面的應(yīng)用,不是因?yàn)樵撜Z(yǔ)言對(duì)這方面進(jìn)行了優(yōu)化,我認(rèn)為主要的原因有以下兩點(diǎn):一個(gè)是簡(jiǎn)單易學(xué),方便了數(shù)學(xué)、工程和金融等行業(yè)各領(lǐng)域的對(duì)新技術(shù)開放包容的人士入門;另一個(gè)是種類豐富而且文檔詳實(shí)的第三方庫(kù)滿足了不同的需求。前者讓更多人加入到Python的行列中來,后者讓Python快速實(shí)現(xiàn)功能的能力非常強(qiáng)大。
今天我們主要講講Python的第三方庫(kù)的管理。這方面的例子有很多,比如剛才提到的數(shù)據(jù)處理機(jī)器學(xué)習(xí),那么不得不提的是SciPy,NumPy和scikit-learn想必很多人都不陌生。不過本專題不是為了學(xué)這個(gè),本專題是借Python學(xué)習(xí)互聯(lián)網(wǎng)相關(guān)知識(shí),所以我們以request和flask為例(哇,突然感覺自己過時(shí)了,但是既然本來決定好了專題內(nèi)容,現(xiàn)在也不臨時(shí)改了。況且我也不會(huì)啊,#無奈。而且我也沒精力同時(shí)更新兩個(gè)專題啊,#攤手。)。
上面是廢話,下面是正文。
pip
沒錯(cuò),首先聲明,我們主要用pip來下載第三方庫(kù),實(shí)在特殊的環(huán)境才會(huì)使用easy_install。原因也很簡(jiǎn)單,virtualenv都開始自帶pip了,我們跟著大佬養(yǎng)成習(xí)慣就好啦。
說了幾句可能有新手還不知道pip到底是什么東西。簡(jiǎn)單來說就是Python的yum,好吧這可能是廢話,操作過RedHat不會(huì)不知道pip。真正地簡(jiǎn)單來說,pip是一個(gè)用來便捷管理Python第三方庫(kù)的命令行工具。由于前面提到過我們主要用Windows示例,我們就用PowerShell來演示。
如果說不知道PowerShell是什么,可以理解為新一代的cmd。如果是以Windows作為主力開發(fā)環(huán)境,建議把PowerShell固定在任務(wù)欄。想要了解PowerShell的更多知識(shí),可以參考Getting Started with PowerShell 3.0 | Channel 9。其中一個(gè)主講Jeffery Snover是PowerShell的主力開發(fā)工程師,是微軟非常厲害的服務(wù)器架構(gòu)和管理方面的大牛,在C9可以免費(fèi)看到大牛手把手教你敲腳本,如果對(duì)英文不自信,該系列甚至還有中文字幕!
之所以如此介紹PowerShell,是因?yàn)樗娴姆浅!皃owerful”,而且我們可以用PowerShell來熟悉Shell編程,熟悉腳本編寫。說到底我們是來學(xué)習(xí)知識(shí)的,不要死盯著pip。如果進(jìn)度許可,以后我可能會(huì)給一個(gè)PowerShell腳本爬蟲實(shí)例(大概會(huì)吧)。是的,PowerShell的一些特性使得他原生地可以非常完美地實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè)的爬蟲功能,甚至要比Python更優(yōu)雅,你就說powerful不powerful。
好了言歸正傳,win+r打開運(yùn)行命令,輸入powershell即可打開命令行窗口。我們就可以直接使用pip命令來下載第三方庫(kù)了。
如果提示沒有該命令,先確保已經(jīng)安裝Python(開個(gè)玩笑),我們可以去設(shè)置環(huán)境變量。既然就在PowerShell,那么不妨就用它來設(shè)置好了(嫌麻煩可以直接我的電腦-右鍵屬性-高級(jí)系統(tǒng)設(shè)置-高級(jí)-環(huán)境變量-用戶變量-Path-加上Python文件夾和scripts文件夾或bin文件夾)。查看所有本地環(huán)境變量可以直接查看虛擬驅(qū)動(dòng)器,查看具體的環(huán)境變量可以查看全局變量:
PS C:\> ls env:
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\somarl\AppData\Roaming
...//其他就省略了
或者
PS C:\> $env:path
I:\SecureCRT\;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client
\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPower
Shell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Fi
les\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R)
Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine C
omponents\IPT;C:\Program Files\Calibre2\;I:\Git\cmd;I:\mysql-5.7.18-winx64\bin;...//還有一大串就省略了
添加環(huán)境變量也很簡(jiǎn)單
PS C:\> $Env:path=$Env:Path+";I:\Anaconda3\Scripts;I:\Anaconda3\Scripts"
這里只是我的示例,PowerShell不是我們要介紹的重點(diǎn),這幾句命令非常簡(jiǎn)單,沒有用到pipeline,很容易理解。
總之只要在命令行中輸入pip回車能夠進(jìn)入庫(kù)管理工具就可以了。
virtualenv
安裝
我們就用虛擬環(huán)境工具包作為外部庫(kù)的第一個(gè)示例。使用pip安裝外部庫(kù)非常簡(jiǎn)單,只要輸入
pip install virtualenv
或者某些情況下(比如有些Linux不同的設(shè)置下)會(huì)需要輸入
pip3 install virtualenv
如果沒有安裝過,那么pip就會(huì)自動(dòng)尋找適配的版本開始下載安裝。這里面存在以下幾個(gè)問題:
找不到適配的版本怎么辦
下載速度太慢怎么辦
安裝失敗怎么辦
首先適配的版本找不到的話,有可能是平臺(tái)(Windows/Linux/Unix)的原因,也有可能是數(shù)位的原因(32/64),也有可能是Python版本的原因(2.4/2.7/3.2/3.5)。這種錯(cuò)誤不會(huì)指出到底是哪個(gè)不適配,具體可以去PyPI查看,PyPI是Python官方的庫(kù)索引,我主要用來查看各種庫(kù)的兼容信息。
下載速度太慢可以換國(guó)內(nèi)的鏡像。這個(gè)在后面介紹conda的時(shí)候會(huì)再介紹。我們可以臨時(shí)在命令行后面加上參數(shù)
pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple
這是清華的鏡像,我自己用的是豆瓣的鏡像,好像阿里也有鏡像,這些百度一下就可以看到。Linux習(xí)慣了改各種配置文件,但是Windows總覺得有些不舒服。conda會(huì)有比較人性化的命令行直接設(shè)置永久的鏡像。
安裝失敗的話,一般會(huì)有報(bào)錯(cuò)信息,可以根據(jù)報(bào)錯(cuò)信息處理。一般來說Windows平臺(tái)常見的報(bào)錯(cuò)是CPython庫(kù)的C依賴相關(guān)問題報(bào)錯(cuò),Linux平臺(tái)常見的報(bào)錯(cuò)是權(quán)限不足的問題。后者比較好解決,直接在命令前面加上sudo就可以了。
CPython的問題有以下幾種解決辦法:
PyPI或者Github找找看有沒有類似的純Python庫(kù)。這么做其實(shí)不太推薦,但是這么做也有好處,就是如果完全不用CPython包可以用PyPy加速。
去LFD找找看有沒有編譯好的wheel文件,全稱叫Python Extension Packages for Windows,這是比較推薦的解決方案。關(guān)于wheel文件的使用方法下面會(huì)講到。
去庫(kù)的Github地址找官方的針對(duì)Windows的編譯好的文件(不一定有,一般是沒有的),或者自己編譯(不推薦,我以前做過這種事,體驗(yàn)很差)。
安裝支持環(huán)境,這個(gè)看上去最理所當(dāng)然的方法反而是我不太喜歡的。原因在于VS有些臃腫,我還是喜歡用VS6.0。
關(guān)于wheel文件的使用,其實(shí)很簡(jiǎn)單,就是pip安裝的時(shí)候不要指出安裝包的名字,直接給出wheel文件的地址就可以了。比如:
pip install G:\action\tmp\Twisted?17.9.0?cp36?cp36m?win_amd64.whl
大概是這樣吧,很久沒用過,應(yīng)該是這樣的。如果失敗了,試試先pip install wheel。
OK,那么就算講完了怎么用pip安裝擴(kuò)展包了。
卸載、更新、查看
和安裝對(duì)應(yīng),卸載只需要輸入
pip uninstall virtualenv
非常合理的做法。至于更新,其實(shí)為了程序的穩(wěn)定運(yùn)行和兼容性,這個(gè)功能其實(shí)是不常用的,這也是pip默認(rèn)你想要更新的話其實(shí)就和直接重新安裝沒區(qū)別,這個(gè)邏輯我覺得設(shè)計(jì)也算巧妙(conda有update功能,pip沒有)。
至于你如果要批量更新,去StackOverflow或者百度找會(huì)有很多腳本,或者Anaconda控制臺(tái),Pycharm都有相應(yīng)的功能可以實(shí)現(xiàn)。當(dāng)然,我并不推薦做這種事情。這也是我們會(huì)需要虛擬環(huán)境的原因,庫(kù)文件穩(wěn)定性是首要考慮的問題,所以更新要慎重。我的意思也不是不建議各位更新,只是不建議批量更新帶來不必要的麻煩。
查看庫(kù)有兩種,一種是查看安裝了哪些庫(kù)
pip list
一種是查看某個(gè)庫(kù)的信息。
pip show virtualenv
list命令也有相關(guān)的參數(shù),也可以寫進(jìn)配置文件中,這里不贅述了。show命令主要是用來看安裝地址location,環(huán)境依賴requires,開源協(xié)議license,當(dāng)然,有些有主頁(yè)的可以找到一些文檔。
關(guān)于pip的講解到此為止,如此簡(jiǎn)單的工具講了這么多廢話了。還有一些功能沒講呢,會(huì)穿插在virtualenv和conda中講。
virtualenv的用法
我們講了這么久我們需要虛擬環(huán)境,那么virtuaenv是什么,到底怎么用呢。
virtualenv是一個(gè)虛擬環(huán)境工具,用來構(gòu)建一個(gè)Python程序運(yùn)行的特殊環(huán)境。之所以需要特殊的環(huán)境,是為了方便移植,比如你可以讓別人輕松地還原你的源程序運(yùn)行的環(huán)境。同時(shí)它也方便的環(huán)境測(cè)試與管理,比如我們可以測(cè)試在不同的Python版本不同的外部庫(kù)版本下程序的表現(xiàn),就可以用虛擬環(huán)境來做到,而不必在電腦上安裝多個(gè)版本Python,避免互相沖突。
具體的各種參數(shù)我就不講了,virtualenv可以指定Python版本,可以指定包括哪些庫(kù)。我們默認(rèn)就是用virtualenv來運(yùn)行我們主要Python版本,主要是為了管理外部庫(kù)環(huán)境復(fù)制和還原,因此我們使用最簡(jiǎn)單的命令就可以了(Python版本的切換我傾向于用Conda,后面會(huì)講到,比較徹底)。
PS G:\action\pipl> virtualenv venv
如果安裝了virtualenv,那么直接進(jìn)入項(xiàng)目根目錄輸入virtualenv venv就會(huì)創(chuàng)建一個(gè)目前Python版本的虛擬環(huán)境。其中venv是這個(gè)環(huán)境的名字,一般都叫這個(gè)。
在比較新的版本virtualenv中,這種默認(rèn)創(chuàng)建方式會(huì)自動(dòng)安裝pip、setuptools、wheel三件套,你也可以通過如--no-pip的參數(shù)來防止安裝這些包。
最簡(jiǎn)單的創(chuàng)建方式是有它的道理的,因?yàn)檫@是最常見的應(yīng)用場(chǎng)景,絕大多數(shù)情況下確實(shí)是virtualenv venv就能解決問題了。創(chuàng)建完成后目錄下會(huì)多出一個(gè)虛擬環(huán)境為名字的文件夾。
進(jìn)入虛擬環(huán)境
創(chuàng)建完成后我們需要進(jìn)入虛擬環(huán)境,否則命令行怎么知道你到底想在哪個(gè)環(huán)境執(zhí)行命令呢。激活的方式很簡(jiǎn)單
PS G:\action\pipl> venv\Scripts\activate
如果出現(xiàn)權(quán)限問題或者安全問題。用管理員運(yùn)行的PowerShell也是無濟(jì)于事的,直接將出錯(cuò)信息百度,會(huì)有更改安全策略的解決方式。如果是Linux環(huán)境,注意source要把Scripts改成bin,值得一提的是Windows環(huán)境下激活虛擬環(huán)境會(huì)卡住幾秒,Linux幾乎是秒進(jìn)。成功進(jìn)入后,命令行會(huì)有虛擬環(huán)境的前綴。
這時(shí)我們?cè)龠M(jìn)行一些動(dòng)作,都是虛擬環(huán)境下了,比如說我們進(jìn)入Python試試引入一些安裝過的外部庫(kù)。
在外部環(huán)境中我肯定是安裝了requests的,這怎么說也算是爬蟲的最關(guān)鍵的庫(kù)了。我們不妨試試剛學(xué)的列出安裝過的Python庫(kù)。
可以看到除了三件套確實(shí)什么都沒有。我們可以試試安裝外部庫(kù)
可以看到確實(shí)可以安裝。
一下子多了許多庫(kù)出來。
退出虛擬環(huán)境
這個(gè)很簡(jiǎn)單,只要在虛擬環(huán)境中輸入deactivate就能退出。
環(huán)境還原
現(xiàn)在我們來講剛才提到的,關(guān)于環(huán)境還原的問題。如果我在開發(fā)中用到了一些依賴環(huán)境,那么我該如何讓別人知道我用了哪些庫(kù)呢?是不是對(duì)著代碼一個(gè)個(gè)去找import了哪些庫(kù)?這樣做不僅麻煩而且容易遺漏,文件一多就會(huì)是很糟糕的體驗(yàn)了。
換個(gè)思路,我們只要讓別人知道用pip安裝過哪些庫(kù)就可以了。我們可以用pipeline把powershell的pip list屏幕輸出保存到文件中。但是還有更簡(jiǎn)單的方法,pip內(nèi)置了這樣方法。
(venv) PS G:\action\pipl> pip freeze >requirements.txt
這樣項(xiàng)目根目錄下會(huì)多出一個(gè)需求文件。打開來看一下。
可以看到除了三件套以外的包都在里面了。使用pip生成需求文件還有一個(gè)好處,就是可以用pip快速還原環(huán)境。比如我們?cè)傩陆ㄒ粋€(gè)虛擬環(huán)境,并且還原剛才的環(huán)境(注意要把requirements.txt放在新項(xiàng)目的根目錄下)。
PS C:\Users\somarl> cd G:\action\pipm
PS G:\action\pipm> virtualenv venv
Using base prefix 'I:\\Anaconda3'
New python executable in G:\action\pipm\venv\Scripts\python.exe
copying I:\Anaconda3\python.exe => G:\action\pipm\venv\Scripts\python.exe
Installing setuptools, pip, wheel...done.
PS G:\action\pipm> cp G:\action\pipl\requirements.txt G:\action\pipm\requirements.txt
PS G:\action\pipm> venv\Scripts\activate
(venv) PS G:\action\pipm> pip install -r requirements.txt
在實(shí)際操作中,我們的項(xiàng)目一般是用git clone下來的,所以不會(huì)需要手動(dòng)去找requirements.txt,而且一般虛擬環(huán)境會(huì)被gitignore掉。這也是為什么大家都用venv當(dāng)作虛擬環(huán)境名字,是為了方便git的相關(guān)操作。當(dāng)然,在上面的操作中我也可以不復(fù)制requirements.txt文件,直接在pip install -r中參數(shù)設(shè)置成之前的路徑就可以,這里是為了還原一般的使用場(chǎng)景,而Git相關(guān)的知識(shí)我還沒有講過,所以目前先不管它。
當(dāng)然這也不是一勞永逸的。我們可以看看還原了哪些庫(kù)。
注意到Twisted不見了,這也是我拿它作示例的原因。這就是我們剛才說過的Windows環(huán)境下pip安裝可能出錯(cuò)的地方。錯(cuò)誤信息是這樣的
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Builds": http://landinghub.visualstudio.com/visual-cpp-build-tools
因此我們確實(shí)有的時(shí)候需要注意到這些問題。如果你用別人的自構(gòu)爬蟲框架,Twisted是出現(xiàn)率非常高的庫(kù)。我們可能會(huì)需要手動(dòng)安裝這樣的庫(kù)。不僅爬蟲,科學(xué)計(jì)算相關(guān)包中對(duì)CPython的依賴其實(shí)更明顯,很多庫(kù)需要手動(dòng)安裝?;蛘吣憧梢允褂肔inux,當(dāng)然如果這種程度的問題都有很大的困擾,那么Linux系統(tǒng)給你帶來的困擾可能會(huì)更多,對(duì)計(jì)算機(jī)原理和操作系統(tǒng)不是特別了解的不太推薦使用Linux。
Conda
除了virtualenv以外,我們提到虛擬環(huán)境,我比較推薦的還有Conda。在我看來Conda其實(shí)更適合本地環(huán)境的構(gòu)建而不是虛擬環(huán)境的構(gòu)建,我個(gè)人是把Conda當(dāng)作增強(qiáng)版的pip來使用的。
Conda強(qiáng)在不僅可以改變環(huán)境的包,甚至可以改變環(huán)境本身。比如說我的電腦裝的是Python3.6,但是后來我發(fā)現(xiàn)我其實(shí)比較喜歡Python3.5怎么辦呢。我不必每次創(chuàng)建一個(gè)虛擬環(huán)境,我不必卸載Python3.6重新安裝一個(gè)Python3.5,我不必更改各種軟鏈(Linux)。Conda可以把默認(rèn)的Python運(yùn)行環(huán)境改掉。
所以說,如果說pip是管理Python庫(kù)的,那么Conda可以說是用來管理Python的(它本身也可以管理庫(kù),而且比pip更強(qiáng),只是包的數(shù)量不及pip多)。至少我目前是這么用的。而且其實(shí)熟悉Linux的同學(xué)可能知道,Conda不僅僅適用于Python,它的適應(yīng)面還能更廣。
Conda和pip以及virtualenv的關(guān)系,就好比Tornado和Django以及uWSGI甚至Nginx的關(guān)系。它是一種類似的交叉包容但又有所側(cè)重的關(guān)系。
所以Conda是非常全能的工具。它可以做到pip能做到的事情,它可以做到virtualenv能做到的事情,它還可以做到這兩個(gè)工具做不到的其他的事情。可惜的事實(shí)是Tornado不僅功能上無所不能、性能也強(qiáng)勁得讓人刮目相看,但卻依然沒有Django受歡迎,也不如Flask,幾乎可以說和Bottle、web2py一樣是被冷落的那類框架。
不過好在Conda還是非常受歡迎的。因?yàn)樗粌H功能強(qiáng),它的虛擬環(huán)境其實(shí)比virtualenv更加純粹。它的Python包管理依賴追蹤能力是pip望塵莫及的。但是出于習(xí)慣,現(xiàn)在主流的虛擬環(huán)境工具是virtualenv,主流的庫(kù)管理工具是pip,這兩個(gè)也是我今天介紹的重點(diǎn)。但我還是要推薦一下Conda,它好到值得你去使用。
具體的使用技巧,本文就不再介紹了,篇幅有限是一方面,另一方面我自己對(duì)Conda的使用也算不上理解多深,就不獻(xiàn)丑了。有興趣的不妨去探索吧。
另外再提一下Python3.3以上版本其實(shí)是有自帶的虛擬環(huán)境工具的,直接就叫作venv,用它創(chuàng)建環(huán)境的方式是這樣的
python -m venv venv
要注意后面的那個(gè)venv是虛擬環(huán)境的名字,前面的那個(gè)是工具的名字。有趣的是它的體積小但性能其實(shí)也很強(qiáng)。使用方法和virtualenv大同小異,這里也不展開講了。
最后講些廢話
之前說好了在Conda相關(guān)內(nèi)容中講怎么用命令行永久改鏡像,結(jié)果后來還是忘了。其實(shí)很簡(jiǎn)單,Conda有config方法直接加參數(shù)--add channels 地址就行了。這樣就能避免在Windows系統(tǒng)中編輯配置文件的違和感了。我Conda用的是清華的鏡像,地址百度一下應(yīng)該就有。
這篇還是以介紹pip和virtualenv為主,我能想到的大部分場(chǎng)景都盡量進(jìn)行了說明,如果有缺漏的地方可以直接留言提出來。
鏈接
總結(jié)
以上是生活随笔為你收集整理的python人工智能方向第三方库_Python进阶-第三方库管理和虚拟环境的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux文件查看命令(linux 文件
- 下一篇: python find函数实现原理_非常