網(wǎng)站性能檢測(cè)評(píng)分
注:本網(wǎng)站頁(yè)面html檢測(cè)工具掃描網(wǎng)站中存在的基本問(wèn)題,僅供參考。
python中的包
python如何導(dǎo)入第三方依賴包API 營(yíng)銷視頻課程
有時(shí)候從網(wǎng)上下載下來(lái)的python API沒(méi)法導(dǎo)入,出現(xiàn)ImportError: No module named * 錯(cuò)誤。以下提供解決方案。
將依賴包目錄放置到*:\Python*\Lib\site-packages\中,即python的安裝目錄中。首先確定API目錄下是否有__init__.py文件,如果沒(méi)有,請(qǐng)新建一個(gè)。
打開(kāi)API主運(yùn)行文件,查看里面的類名稱。此處為main.py文件,類為class dcVerCode。
此處以導(dǎo)入main中的類dcVerCode為例。打開(kāi)__init__.py,輸入:from main import dcVerCode這樣就完成了依賴包的指定。然后再在程序中導(dǎo)入該包即可,此處的依賴包名稱為qqcr(即目錄名稱),所以輸入:import qqcr即可完成包的導(dǎo)入。
python包管理之pip,其實(shí)很簡(jiǎn)單! 流量視頻課程
前言
pip 是一個(gè)Python包管理工具,主要是用于安裝 PyPI 上的軟件包,可以替代 easy_install 工具。
安裝pip
1、源碼安裝
Python2編譯安裝的時(shí)候沒(méi)有安裝pip,可以直接從官方地址下載就可以了。官方地址:https://pypi.python.org/pypi/pip
下載解壓后,進(jìn)入目錄直接運(yùn)行python安裝就可以了
python setup.py install
(PS:Python3編譯安裝就默認(rèn)帶了pip了)
2、使用包管理軟件安裝
Linux系統(tǒng)一般都是有自帶Python,如果只需要系統(tǒng)自帶的Python,直接從系統(tǒng)的包管理器安裝可以了。
yum install python-pip
或者
apt-get install python-pip
pip更新
pip可以自己更新自己
pip install -U pip
基本使用
(以django包為例)
1、安裝PyPI軟件
pip install django
2、查看具體安裝文件
pip show --files django
3、查看哪些軟件需要更新
pip list --outdated
4、升級(jí)軟件包
pip install --upgrade django
5、卸載軟件包
pip uninstall django
6、安裝具體版本軟件
pip install django #最新版本
pip install django==1.11.8 # 指定版本
pip install 'django>=1.11.0' # 大于某個(gè)版本
7、 Requirements文件安裝依賴軟件
Requirements文件 一般記錄的是依賴軟件列表,通過(guò)pip可以一次性安裝依賴軟件包:
pip freeze >requirements.txt
pip install -r requirements.txt
8、 列出軟件包清單
pip list
pip list --outdated
9、查看軟件包信息
pip show django
10、搜索
pip search django
配置pip
配置文件: $HOME/.pip/pip.conf,
比如使用阿里云的同步鏡像:
[global]index-url = http://mirrors.aliyun/pypi/simple/[install]trusted-host=mirrors.aliyun
命令行自動(dòng)補(bǔ)全
對(duì)于bash:
pip completion --bash >>~/.profile
對(duì)于zsh:
pip completion --zsh >>~/.zprofile
看完這篇文章還不懂Python中的閉包,請(qǐng)拍死小編 公司視頻課程
Python作為一門編程語(yǔ)言,被昵稱為“膠水語(yǔ)言”,更被熱愛(ài)它的程序員譽(yù)為“最美麗的”編程語(yǔ)言。從云端、客戶端,到物聯(lián)網(wǎng)終端,python應(yīng)用無(wú)處不在。
Python中的閉包不是一個(gè)一說(shuō)就能明白的概念,但是隨著你往學(xué)習(xí)的深入,無(wú)論如何你都需要去了解這么一個(gè)東西。
閉包的概念
我們嘗試從概念上去理解一下閉包。
在一些語(yǔ)言中,在函數(shù)中可以(嵌套)定義另一個(gè)函數(shù)時(shí),如果內(nèi)部的函數(shù)引用了外部的函數(shù)的變量,則可能產(chǎn)生閉包。閉包可以用來(lái)在一個(gè)函數(shù)與一組“私有”變量之間創(chuàng)建關(guān)聯(lián)關(guān)系。在給定函數(shù)被多次調(diào)用的過(guò)程中,這些私有變量能夠保持其持久性。—— 維基百科
用比較容易懂的人話說(shuō),就是當(dāng)某個(gè)函數(shù)被當(dāng)成對(duì)象返回時(shí),夾帶了外部變量,就形成了一個(gè)閉包??蠢印?/p>
支持將函數(shù)當(dāng)成對(duì)象使用的編程語(yǔ)言,一般都支持閉包。比如Python, JavaScript。
如何理解閉包
閉包存在有什么意義呢?為什么需要閉包?
我個(gè)人認(rèn)為,閉包存在的意義就是它夾帶了外部變量(私貨),如果它不夾帶私貨,它和普通的函數(shù)就沒(méi)有任何區(qū)別。同一個(gè)的函數(shù)夾帶了不同的私貨,就實(shí)現(xiàn)了不同的功能。其實(shí)你也可以這么理解,閉包和面向接口編程的概念很像,可以把閉包理解成輕量級(jí)的接口封裝。
接口定義了一套對(duì)方法簽名的約束規(guī)則。
在這個(gè)例子里,我們想要一個(gè)給content加tag的功能,但是具體的tag_name是什么樣子的要根據(jù)實(shí)際需求來(lái)定,對(duì)外部調(diào)用的接口已經(jīng)確定,就是add_tag(content)。如果按照面向接口方式實(shí)現(xiàn),我們會(huì)先把a(bǔ)dd_tag寫成接口,指定其參數(shù)和返回類型,然后分別去實(shí)現(xiàn)a和b的add_tag。
但是在閉包的概念中,
add_tag
就是一個(gè)函數(shù),它需要
tag_name
和
content
兩個(gè)參數(shù),只不過(guò)
tag_name
這個(gè)參數(shù)是打包帶走的。所以一開(kāi)始時(shí)就可以告訴我怎么打包,然后帶走就行。
上面的例子不太生動(dòng),其實(shí)在我們生活和工作中,閉包的概念也很常見(jiàn)。比如說(shuō)手機(jī)撥號(hào),你只關(guān)心電話打給誰(shuí),而不會(huì)去糾結(jié)每個(gè)品牌的手機(jī)是怎么實(shí)現(xiàn)的,用到了哪些模塊。再比如去餐館吃飯,你只要付錢就可以享受到服務(wù),你并不知道那桌飯菜用了多少地溝油。這些都可以看成閉包,返回來(lái)的是一些功能或者服務(wù)(打電話,用餐),但是這些功能使用了外部變量(天線,地溝油等等)。
你也可以把一個(gè)類實(shí)例看成閉包,當(dāng)你在構(gòu)造這個(gè)類時(shí),使用了不同的參數(shù),這些參數(shù)就是閉包里的包,這個(gè)類對(duì)外提供的方法就是閉包的功能。但是類遠(yuǎn)遠(yuǎn)大于閉包,因?yàn)殚]包只是一個(gè)可以執(zhí)行的函數(shù),但是類實(shí)例則有可能提供很多方法。
何時(shí)使用閉包
其實(shí)閉包在Python中很常見(jiàn),只不過(guò)你沒(méi)特別注意這就是一個(gè)閉包。比如Python中的裝飾器Decorator,假如你需要寫一個(gè)帶參數(shù)的裝飾器,那么一般都會(huì)生成閉包。
為什么?因?yàn)镻ython的裝飾器是一個(gè)固定的函數(shù)接口。它要求你的裝飾器函數(shù)(或裝飾器類)必須返回這樣一種接口,接受一個(gè)函數(shù)并返回一個(gè)函數(shù):
那么如果你的裝飾器如果帶參數(shù)呢?那么你就需要在原來(lái)的裝飾器上再包一層,用于接收這些參數(shù)。這些參數(shù)(私貨)傳遞到內(nèi)層的裝飾器里后,閉包就形成了。所以說(shuō)當(dāng)你的裝飾器需要自定義參數(shù)時(shí),一般都會(huì)形成閉包。(類裝飾器例外)
# 不用@的寫法如下# hello = html_tag('b')(hello)# html_tag('b') 是一個(gè)閉包,它接受一個(gè)函數(shù),并返回一個(gè)函數(shù)print hello() # Hello Toby!print hello('world') # Hello world!
再深入一點(diǎn)
其實(shí)也不必太深入,理解這上面的概念,很多看起來(lái)頭疼的代碼也不過(guò)如此。
下面讓我們來(lái)了解一下閉包的包到底長(zhǎng)什么樣子。其實(shí)閉包函數(shù)相對(duì)與普通函數(shù)會(huì)多出一個(gè)
__closure__
的屬性,里面定義了一個(gè)元組用于存放所有的
cell
對(duì)象,每個(gè)
cell
對(duì)象一一保存了這個(gè)閉包中所有的外部變量。
原理就是這么簡(jiǎn)單。
Python之包管理工具快速入門 公司視頻課程
在Python環(huán)境中已經(jīng)有很多成熟的包,可以通過(guò)安裝這些包來(lái)擴(kuò)展我們的程序。
例如,很多時(shí)候Python開(kāi)發(fā)人員都會(huì)去PyPI網(wǎng)站去查找自己想要使用的包,然后進(jìn)行安裝。PyPI ( Python Package Index)是獲得第三方 Python 軟件包以補(bǔ)充標(biāo)準(zhǔn)庫(kù)的一個(gè)站點(diǎn)。
在安裝Python包的過(guò)程中,經(jīng)常涉及到distutils、setuptools、distribute、setup.py、easy_install、easy_install和pip等等。
突然對(duì)Python的包管理凌亂了,這些工具關(guān)系是什么,應(yīng)該怎么去選擇使用?
下面就簡(jiǎn)單介紹下Python包管理相關(guān)的一些內(nèi)容。
Python包管理工具
這么多的Python包管理工具,剛開(kāi)始接觸Python時(shí)會(huì)有點(diǎn)不知如何選擇。其實(shí),當(dāng)查過(guò)Python的官方文檔之后,慢慢就理清了這些工具之間的關(guān)系了,也就沒(méi)有這么混亂了。
下面就分別對(duì)Python中的包管理工具進(jìn)行簡(jiǎn)單的介紹。
distutils
distutils 是 python 標(biāo)準(zhǔn)庫(kù)的一部分,這個(gè)庫(kù)的目的是為開(kāi)發(fā)者提供一種方便的打包方式, 同時(shí)為使用者提供方便的安裝方式。
我們經(jīng)常使用的setup.py就是基于distutils實(shí)現(xiàn)的,然后通過(guò)setup.py就可以進(jìn)行打包或者安裝了。
看一個(gè)簡(jiǎn)單的例子,找一個(gè)目錄創(chuàng)建三個(gè)文件foo.py、bar.py和setup.py,其中setup.py的內(nèi)容如下:
from distutils.core import setupsetup( name='fooBar', version='1.0', author='Will', author_email='wilber@sh', url='http://cnblogs/wilber2013/', py_modules=['foo', 'bar'],)
然后,在該目錄中運(yùn)行 python setup.py sdist ,會(huì)得到以下輸出,同時(shí)生成了一個(gè)"fooBar-1.0.zip"包。
使用者就可以解壓縮這個(gè)包然后執(zhí)行 python setup.py install進(jìn)行安裝,然后就可以使用foo、bar這兩個(gè)模塊了:
關(guān)于更過(guò)如何編寫setup.py的內(nèi)容,請(qǐng)自行參閱Python官方文檔中的setupscript部分。
setuptools 和 distribute
setuptools 是對(duì) distutils 的增強(qiáng),尤其是引入了包依賴管理。我們可以通過(guò)ez_setup.py來(lái)安裝setuptools。
至于distribute,它是setuptools的一個(gè)分支版本。分支的原因是有一部分開(kāi)發(fā)者認(rèn)為 setuptools 開(kāi)發(fā)太慢。但現(xiàn)在,distribute 又合并回了 setuptools 中,所以可以認(rèn)為它們是同一個(gè)東西。
前面看到setup.py可以創(chuàng)建一個(gè)壓縮包,而setuptools使用了一種新的文件格式(.egg),可以為Python包創(chuàng)建 egg文件。setuptools 可以識(shí)別.egg文件,并解析、安裝它
easy_install
當(dāng)安裝好setuptools/distribute之后,我們就可以直接使用easy_install這個(gè)工具了:
1.從PyPI上安裝一個(gè)包:當(dāng)使用 easy_install package 命令后,easy_install 可以自動(dòng)從 PyPI 上下載相關(guān)的包,并完成安裝,升級(jí)
2.下載一個(gè)包安裝:通過(guò) easy_install package.tgz 命令可以安裝一個(gè)已經(jīng)下載的包
3.安裝egg文件:通過(guò) easy_install package.egg 可以安裝一個(gè)egg格式的文件
通過(guò) easy_install --help 命令可以獲取該命令相關(guān)的幫助提示:
根據(jù)上面的分析,可以看到setuptools/distribute和easy_install之間的關(guān)系:
*setuptools/distribute 都擴(kuò)展了 distutils,提供了更多的功能
*easy_install是基于setuptools/distribute的一個(gè)工具,方便了包的安裝和省級(jí)
pip
pip是目前最流行的Python包管理工具,它被當(dāng)作easy_install的替代品,但是仍有大量的功能建立在setuptools之上。
easy_install 有很多不足:安裝事務(wù)是非原子操作,只支持 svn,沒(méi)有提供卸載命令, 安裝一系列包時(shí)需要寫腳本。pip 解決了以上問(wèn)題,已經(jīng)成為新的事實(shí)標(biāo)準(zhǔn)。
pip的使用非常簡(jiǎn)單,并支持從任意能夠通過(guò) VCS 或?yàn)g覽器訪問(wèn)到的地址安裝 Python 包:
*安裝: pip install SomePackage
*卸載: pip uninstall SomePackage
文章的下面部分就重點(diǎn)介紹一下pip相關(guān)的內(nèi)容。
使用pip
在大家使用Python中,推薦使用pip進(jìn)行Python包管理,pip的安裝和使用都比較方便。
pip安裝
pip的安裝有兩種常用的方式:
1.下載get-pip.py文件,然后執(zhí)行 python get-pip.py 進(jìn)行安裝(如果沒(méi)有安裝setuptools,那么get-pip.py會(huì)幫忙安裝)
2.現(xiàn)在pip源碼包,然后通過(guò)setup.py進(jìn)行安裝
pip常用命令
對(duì)于pip,最常用的肯定還是 pip --help ,通過(guò)幫助文檔,就可以大概知道如何使用命令和參數(shù)。
pip常用命令集合:
使用
命令
從PyPI安裝軟件包
pip install SomePackage
卸載軟件包
pip uninstall SomePackage
查看以安裝軟件包
pip list
查看可升級(jí)軟件包
pip list --outdated
升級(jí)軟件包
pip install --upgrade SomePackage
查看軟件包安裝了哪些文件及路徑等信息
pip show --files SomePackage
安裝軟件包的指定版本號(hào)
pip install SomePackage
# latest version
pip install SomePackage==1.0.4
# specific version
pip install 'SomePackage>=1.0.4'
# minimum version
根據(jù)依賴文件安裝軟件包
pip freeze >requirements.txt
# 使用pip導(dǎo)出依賴文件列表
pip install -r requirements.txt
# 根據(jù)依賴文件列表,自動(dòng)安裝對(duì)應(yīng)的軟件包
總結(jié)
本文介紹了Python的各個(gè)包管理工具之間的關(guān)系,相信通過(guò)這篇文章的介紹,就不會(huì)再對(duì)distutils、setuptools、distribute、setup.py、easy_install、easy_install和pip等等名詞感覺(jué)混亂了。
大致了解這些Python包管理工具后,大家應(yīng)該也清楚了怎么選擇和使用。
本文沒(méi)有涉及如何制作并發(fā)布一個(gè)Python包,感興趣的同學(xué)可以去Python官網(wǎng)上查查。
Python創(chuàng)建包 流量視頻課程
Python中創(chuàng)建包是比較方便的,只需要在當(dāng)前目錄建立一個(gè)文件夾,文件夾中包含一個(gè)__init__.py文件和若干個(gè)模塊文件,其中__init__.py可以是一個(gè)空文件,但還是建議將包中所有需要導(dǎo)出的變量放到__all__中,這樣可以確保包的接口清晰明了,易于使用。
Python包的目錄結(jié)構(gòu)示意圖
示例:
包名稱:
mypackage(假設(shè)包中還有兩個(gè)子包)
包文件夾中的文件:
__init__.py
module1.py
定義了一個(gè)fun1()函數(shù),該函數(shù)需要導(dǎo)出
module2.py
定義了一個(gè)fun2()函數(shù),一個(gè)Class2類
子包:
subpackage1
subpackage2
__init__.py文件內(nèi)容(未導(dǎo)出子包中的內(nèi)容)
Python包中的__init__.py文件