python3 模塊和包


一.模塊(Module)和包(Package)

1.模塊:一個包含所有你定義的函數和變量的文件,其后綴名是 .py ,一個.py文件就是一個模塊

2.包:一定包含 __init__.py模塊 的文件夾,一般也會包含其他一些模塊和子包

3.庫(lib):庫是完成一定功能的代碼集合,具體表現可以是包,也可以是一個模塊

4.框架(framework):為解決一個開放性問題而設計的具有一定約束性的支撐結構

5.python內置了一些庫,除此之外,還有其他人自己做的一些庫,稱之為第三方庫

6.一般把第三方庫放在.../python3/lib/site_packages中

 

二.第三方庫的下載和安裝

1.安裝第三方庫實質上是下載並使用別人寫的代碼

2.常見的第三方庫的格式:源碼(Source)(壓縮包,需先解壓,得到包含setup.py文件夾);egg(本質是壓縮包);whl(本質也是壓縮文件)

3.安裝方式:

(1)源碼安裝(本地安裝):手動下載,再安裝到本地;

(2)包管理安裝(遠程安裝):通過命令使自動化的為用戶安裝管理包和模塊

4.源碼安裝

(1)到對應庫托管網站下載所需要的文件,https://pypi.org/或https://www.lfd.uci.edu/~gohlke/pythonlibs/等

(2)下載的文件要對應自己python的版本,還要選擇32位還是64位安裝的python的系統

(3)打開命令行(win+R cmd):切換到下載的文件所在的目錄 cd /d

(4)對於帶setup.py的文件(源碼文件),輸入命令:python setup.py install 

注意:若沒有setuptools包,需手動下載安裝,再利用setuptools安裝其他使用setuptools打包的包

(5)對於 .egg文件使用easy_stall安裝,輸入命令:easy_install xxx.egg(完整文件名稱)

(6)對於whl文件可以使用easy_stall如上安裝,也可以使用pip安裝,輸入命令:pip install xxx.whl(完整文件名稱)

5.遠程安裝easy_install和pip,需先知道要安裝的庫名

6.easy_install:http://peak.telecommunity.com/DevCenter/EasyInstall

(1)是setuptools的自帶安裝腳本,用於安裝.egg文件

(2)在多個python版本的切換安裝:安裝到3.6python中:easy_install-3.6 xxx

(3)安裝指定版本包:easy_install  “ 庫名  限定符(<,>,<=,>=,==)   版本 ”; 例:easy_install  “ request >1.0,<2.0 ”   安裝大於1.0並且小於2.0的版本

(4)升級三方包:easy_install --upgrade (-U)  庫名,例如:easy_install --upgrade requests

(5)卸載三方包:(1)手動卸載刪除對應的包記錄或刪除在easy-install.pth中的包記錄(2)easy_install -m 包名稱:自動刪除在easy-install.pth中的包記錄

(6)-m的真正含義:支持多版本,可在運行時進行切換,使用:>>>import pkg_resources   >>>pkg resources.require("對應版本的包名")>>import 對應版本的包

(7)easy_install.pth文件:記錄當前通過easy_install已經安裝的模塊(多個版本的模塊,只記錄最后一次安裝的);用於導入模塊時的路徑檢索

(8)切換三方安裝源:在easy_install修改文件setuptools\command\easy_install.py文件中搜索pypi.python.org找到對應地址並修改

7.pip:http://pip.pypa.io/en/stable/

(1)是pip庫中的安裝腳本,用於安裝.whl文件

(2)切換安裝包安裝源:

一次性修改:pip install --index -url https://..../包名(指定檢索)或pip install -extra-index-url https://..../包名(拓展檢索)

永久性修改

(3)安裝在不同的python版本環境中(1)python m pip install xxx或python3 m pip install xxx(2)py -2 m pip install xxx或py -3 m pip install xxx

(4)查看包:已經安裝好的包:pip list;不被依賴的包:pip list  --not-required ;過期的包:pip list --outdated;某個包的具體信息:pip show xxx

(5)搜索包:pip search xxx或pip search -i 檢索地址 xxx

(6)安裝指定版本包:pip install “庫名 限定符(<,>,<=,>=,==) 版本”; 例:pip install “request >1.0,<2.0”安裝大於1.0並且小於2.0的版本

(7)升級三方包:pip install --upgrade (-U) 庫名,例如:pip install --upgrade requests注:pip的升級是先卸載當前版本,在下載安裝最新版本,如果庫存在,直接執行安裝命令並不會更新庫

(8)卸載三方包:pip uninstall xxx

(9)生成凍結需求的文本:把當前安裝的三方包記錄存儲在指定的文件當中:pip freeze  > C:\Users\11373\Desktop\bao.txt生成存儲包信息的文本文檔

pip install -r bao.txt下載並安裝文本文檔中的包

8.pycharm中安裝:Settings---project ---project interpreter---界面右邊列出不同環境下的包,右邊操作:+增加 -刪除 |更新----對應的包install package----manage repositories(管理庫的鏈接地址)

9.總結

安裝一個庫:

(1)pycharm中搜索安裝

(2)命令行 pip install xxx

(3)如果上面都出現問題,https://www.lfd.uci.edu/~gohlke/pythonlibs/下載相應庫到本地,命令行 pip install xxx.whl

 

三.導入模塊和包

1.使用(from  A )import B (as C) 的形式進行導入:從A導入B到當前位置,使用別名C。

(1)from  包  import  單個或多個模塊

(2)from  模塊  import  模塊資源(比如:函數,屬性等)

(3)要保證面向原則,即只能導入自己的下一級,不能從包中導入模塊的資源或從大包中導入小包的模塊

(4)import * 表示導入能匹配到的所有資源,存放在__all__=[ ](列表中每個元素都是字符串)

(5)import和from...import...不存在哪種更省內存,都創建了模塊對象,區別在於把哪一部分內容拿到當前位置來用

(6)導入包時如果只寫包名,默認不會導入所有模塊,應在init模塊中再次導入需要的模塊或以from...import...的形式導入

2.導入時,需要把命令放在腳本的頂端

3.對同一庫的導入只會被執行一次,不管你有多少個import。這樣可以防止庫被一遍又一遍地執行

4.導入模塊時,會自動執行該模塊;導入包時,會自動執行對應的init.py文件

5.執行import語句時會自動搜索,來確定該包或模塊存在

(1)查找路徑順序是:內存中已經加載的模塊 -> 內置模塊 -> sys.path路徑(導入模塊的環境變量)中包含的模塊

(2)當解釋器遇到 import 語句,如果模塊在當前的搜索路徑就會被導入

(3)當安裝第三方模塊的時候,如果不是按照標准方式安裝,則為了能夠引用(import)這些模塊,必須將這些模塊的安裝路徑添加到sys.path中

(4)只要包或模塊放在sys.path路徑中,都可以import使用它

6.第一次導入和第二次導入

(1)第一次導入:在自己當下的命名空間執行所有代碼,創建一個模塊對象,並將模塊內所有頂級變量以屬性的形式綁定在模塊對象上,在import的位置,引入import后面的變量名稱到當前命名空間;第二次導入時,直接執行上述最后一步

按照模塊檢索路徑先后順序查找:1.內置模塊  2.sys.path   3.自己追加路徑

 

(2)追加路徑的方式:1.sys.path.append()只限本次添加路徑; 2.修改環境變量,僅僅在shell中有效;  3.添加.pth文件

1 import site
2  
3 print(site.getsitepackages())#查找特殊路徑,可以用來存放.pth文件
4 #在.pth配置文件中添加路徑,系統會自動識別
.pth

(3)pycharm中修改路徑:Settings--Project Interpreters(*的show all)--點擊Project Interpreters界面右邊的最后一個標識show path---在Interpreter Paths界面中點加號添加路徑

(4)sys.path優先級:當前目錄---python環境變量中配置的路徑----pthon的安裝路徑-----安裝路徑下的.pth文件-----lib庫(lib\\site-packages)----lib庫中配置的.pth文件---pycharm我們加的路徑

(5)第二次導入:從已經加載過的模塊中去找,查看已加載模塊:sys.modules

7.導入模塊的常見場景:局部導入、覆蓋導入(sys中路徑前的覆蓋路徑后的;內置的覆蓋自定義的)、循環導入(A導入B,B導入A)、可選導入(兩個功能相近的包,根據需求優先選擇一個導入try..except...)、包內導入(包外:絕對導入from a import b,包內:相對導入from ../. inport b)

8.當我們嘗試去使用解釋器去執行某一個py文件的時候,那他就會確定當前文件所在的目錄,然后,再把這個目錄添加到sys.path。添加過后,再往后,基本上這個sys.path里面的內容已經確定

8.導入模塊和導入包

 1 #目錄:
 2 # 導入模塊和包---
 3 #   |
 4 # 上級包、上級模塊、導入模塊和包的init模塊-----
 5 #   |
 6 # 同級包、同級模塊、上級包的init模塊、test模塊--------
 7 #   |
 8 # 下級包、下級模塊、同級包的init模塊-----
 9 #   |
10 #最下級模塊、下級包的init模塊
11 
12 #以test模塊為執行模塊導入相應的模塊
13 #導入同級模塊
14 import 同級模塊#直接導入單個模塊並執行該模塊
15 print(同級模塊.name)#打印模塊中的name屬性
16 print('*'*30)
17 
18 #導入下級模塊
19 # import 下級模塊 #不能直接導入同級包下面的模塊No module named '下級模塊'
20 # print(下級模塊.name)#打印模塊中的name屬性
21 #修改方法:
22 import 同級包.下級模塊#導入同級包的下級模塊,執行包的__init__模塊和導入的模塊
23 print(同級包.下級模塊.name)#打印該模塊的name屬性
24 print('*'*30) 25 26 #導入下下級模塊 27 # import 下級包.最下級模塊#No module named '下級包' 28 # print(下級包.最下級模塊.name) 29 # import 同級包.最下級模塊#No module named '同級包.最下級模塊' 30 # print(同級包.最級模塊.name) 31 #修改: 32 import 同級包.下級包.最下級模塊 33 print(同級包.下級包.最下級模塊.name) 34 print('*'*30) 35 36 #導入上級模塊 37 # import 上級模塊#不能直接導入同級包上面的模塊No module named '上級模塊'’ 38 # print(下級模塊.name)#打印模塊中的name屬性 39 #修改方法 40 import 導入模塊和包.上級模塊#導入再上級包下的上級模塊,執行包的__init__模塊和導入的模塊 41 print(導入模塊和包.上級模塊.name) 42 ---------------------------------------------- 43 執行同級模塊 44 同級模塊 45 ****************************** 46 同級包的init模塊 47 執行下級模塊 48 下級模塊 49 ****************************** 50 下級包的init模塊 51 執行最下級模塊 52 最下級模塊 53 ****************************** 54 導入模塊和包 55 執行上級模塊 56 上級模塊
導入模塊
 1 #導入包
 2 import 同級包 #導入同級包直接導入
 3 
 4 # print(同級包.下級模塊.name)#module '同級包' has no attribute '下級模塊'
 5 # 修改:若要使用包下的某個模塊,可以在對應init模塊中導入相應的模塊
 6 
 7 # import 上級包#No module named '上級包'
 8 # import 下級包No module named '下級包'
 9 #為什么找不到對應的包:因為是在內置模塊和sys.path中找,在對應的路徑中並沒有這個包
10 # 解決:
11 import sys
12 print(sys.path) 13 sys.path.append('E:\\python_work\\導入模塊和包') 14 sys.path.append(r'E:\python_work\導入模塊和包\上級包\同級包') 15 import 上級包 16 import 下級包 17 18 19 import 導入模塊和包 20 ---------------------------------------------------------- 21 同級包的init模塊 22 ['E:\\python_work\\導入模塊和包\\上級包', 'E:\\python_work', 'E:\\python3.6.4\\python36.zip', 'E:\\python3.6.4\\DLLs', 'E:\\python3.6.4\\lib', 'E:\\python3.6.4', 'C:\\Users\\11373\\AppData\\Roaming\\Python\\Python36\\site-packages', 'E:\\python3.6.4\\lib\\site-packages', 'E:\\python3.6.4\\lib\\site-packages\\requests-2.18.4-py3.6.egg', 'E:\\python3.6.4\\lib\\site-packages\\pymongo-3.6.1-py3.6-win32.egg', 'E:\\python3.6.4\\lib\\site-packages\\easygui-0.98.1-py3.6.egg', 'E:\\python3.6.4\\lib\\site-packages\\jedi-0.12.0-py3.6.egg', 'E:\\python3.6.4\\lib\\site-packages\\parso-0.2.0-py3.6.egg', 'E:\\pycharm\\PyCharm 2017.3.3\\helpers\\pycharm_matplotlib_backend'] 23 上級包的init模塊 24 下級包的init模塊 25 導入模塊和包
導入包

9.導入包

(1)包要想能夠使用,__init__.py文件得添加一句from . import * ,意思是從當前包的目錄導入所有 模塊文件,因為包的導入會首先執行__init__.py

(2) 變量__all__包含一個列表,起到過濾變量、函數和類的作用,表示允許哪些可以被導入

 

四.sys模塊(與系統功能有關的模塊)

1.sys.path一個目錄列表,供Python從中查找第三方擴展模塊

 1 import sys
 2 #sys.path獲取指定模塊搜索路徑的字符串集合,可以將寫好的模塊放在得到的某個路徑下,就可以在程序中import時正確找到
 3 print(sys.path) 4 ------------------------------------------------------------------------------- 5 ['E:\\python_work', 'E:\\python_work', 6 'E:\\python3.6.4\\python36.zip', 7 'E:\\python3.6.4\\DLLs', 8 'E:\\python3.6.4\\lib', 9 'E:\\python3.6.4', 10 'E:\\python3.6.4\\lib\\site-packages', 11 'E:\\pycharm\\PyCharm 2017.3.3\\helpers\\pycharm_matplotlib_backend']
sys.path

2.sys.argv

 1 import sys
 2 #在外部向程序內部傳遞參數sys.argv
 3 print(sys.argv[0])# 獲取腳本名字
 4 print(sys.argv) 5 6 for i in sys.argv: 7 print(i) # 獲取參數列表 8 9 print(len(sys.argv)-1)# 統計參數個數 10 ------------------------------------ 11 E:/python_work/python.3.11.py 12 ['E:/python_work/python.3.11.py'] 13 E:/python_work/python.3.11.py 14 0
sys.argv

 

五.__name__屬性

1.a模塊被另一個程序第一次引入時,a模塊主程序將運行

2.用__name__屬性來使程序塊僅在模塊自身運行時執行,被引用時不執行

3.每個模塊都有一個__name__屬性,當其值是'__main__'時,表明該模塊自身在運行,否則是被引入

4.一個py文件直接以腳本的形式進行執行,它的名字就是__main__;若是使用模塊的形式進行加載的,他的名字是由加載的路徑決定的:包名.子包名.模塊名    頂級名稱

 1 def dayin():
 2     print('dayingg') 3 dayin() 4 if __name__ == '__main__': 5 print('程序自身在運行') 6 else: 7 print('我來自另一模塊') 8 --------------------------------------------------------- 9 dayingg 10 程序自身在運行
dayin.py
1 import dayin
2  ---------------------------------------------
3 dayingg 4 我來自另一模塊
另一文件中

 

六.dir() 函數

1.內置的函數 dir() 可以找到模塊內定義的所有名稱。以一個字符串列表的形式返回

2.如果沒有給定參數,那么 dir() 函數會羅列出當前定義的所有名稱

 1 a = [1, 2, 3, 4, 5]
 2 import dayin 3 print(dir(dayin))# 得到一個指定模塊中定義的名稱 4 print(dir()) # 得到一個當前模塊中定義的屬性列表 5 c=5 # 建立一個新的變量 'a' 6 print(dir()) 7 del c # 刪除變量名a 8 print(dir()) 9 ----------------------------------------------------- 10 dayingg 11 我來自另一模塊 12 ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'dayin'] 13 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'dayin'] 14 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'c', 'dayin'] 15 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'dayin']
dir()

 

七.補充

1.三方包的版本規則n1.n2.n3

(1)n1:修改了之前的功能或者添加了一個新功能(修改了之前的api)n1+1

(2)n2:新增了某個小功能 n2+1

(3)n3:當版本的bug修復之后 n3+1

2.發布一個包:https://python_packaging.readthedocs.io/en/latest/minimal.html

(1)注冊賬號pypi

(2)環境准備

(3)發布前的准備

創建一個項目並編譯生成發布包;

具體的setup.py腳本文檔描述:https://docs.python.org/2/distutils/setupscript.html和https://packaging.python.org/tutorials/distributing-packages/

(打包)命令行執行setup.py:切換包所在目錄------python setup.py sdist(自動在包中生成dist文件,里面有壓縮好的文件)

readme.rst:http:\\zh-sphinx-doc.readthedocs.io/en/latest/contents.html

  

 license.txt:https://choosealicense.com/

 

 manifest.in:https://docs.python.org/3/distutils/sourcedist.html#specifying-the-files-to-distribute

 

 

二進制的發行包:解壓直接拷貝到指定目錄

windows下的安裝文件直接雙擊執行安裝

上傳到pypi:命令行操作:1.切換目標目錄,2.twine upload 要上傳的文件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM