6. 模塊和包

一. 模塊(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,需先知道要安裝的庫名

常用國內鏡像服務器地址:
	https://blog.csdn.net/yamadeee/article/details/80178996
	
安裝命令:
	pip install xxxx -i https://pypi.tuna.tsinghua.edu.cn/simple
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文件
import site

print(site.getsitepackages())#查找特殊路徑,可以用來存放.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裏面的內容已經確定

9.導入模塊和導入包
'''
目錄:
 導入模塊和包---
   |
 上級包、上級模塊、導入模塊和包的init模塊-----
   |
 同級包、同級模塊、上級包的init模塊、test模塊--------
   |
 下級包、下級模塊、同級包的init模塊-----
   |
最下級模塊、下級包的init模塊
'''
#以test模塊爲執行模塊導入相應的模塊
#導入同級模塊
import 同級模塊#直接導入單個模塊並執行該模塊
print(同級模塊.name)#打印模塊中的name屬性
print('*'*30)

#導入下級模塊
# import 下級模塊 #不能直接導入同級包下面的模塊No module named '下級模塊'
# print(下級模塊.name)#打印模塊中的name屬性
#修改方法:
import 同級包.下級模塊#導入同級包的下級模塊,執行包的__init__模塊和導入的模塊
print(同級包.下級模塊.name)#打印該模塊的name屬性
print('*'*30)

#導入下下級模塊
# import 下級包.最下級模塊#No module named '下級包'
# print(下級包.最下級模塊.name)
# import 同級包.最下級模塊#No module named '同級包.最下級模塊'
# print(同級包.最級模塊.name)
#修改:
import 同級包.下級包.最下級模塊
print(同級包.下級包.最下級模塊.name)
print('*'*30)

#導入上級模塊
# import 上級模塊#不能直接導入同級包上面的模塊No module named '上級模塊'’
# print(下級模塊.name)#打印模塊中的name屬性
#修改方法
import 導入模塊和包.上級模塊#導入再上級包下的上級模塊,執行包的__init__模塊和導入的模塊
print(導入模塊和包.上級模塊.name)
----------------------------------------------
執行同級模塊
同級模塊
******************************
同級包的init模塊
執行下級模塊
下級模塊
******************************
下級包的init模塊
執行最下級模塊
最下級模塊
******************************
導入模塊和包
執行上級模塊
上級模塊
#導入包
import 同級包 #導入同級包直接導入

# print(同級包.下級模塊.name)#module '同級包' has no attribute '下級模塊'
# 修改:若要使用包下的某個模塊,可以在對應init模塊中導入相應的模塊

# import 上級包#No module named '上級包'
# import 下級包No module named '下級包'
#爲什麼找不到對應的包:因爲是在內置模塊和sys.path中找,在對應的路徑中並沒有這個包
# 解決:
import sys
print(sys.path)
sys.path.append('E:\\python_work\\導入模塊和包')
sys.path.append(r'E:\python_work\導入模塊和包\上級包\同級包')
import 上級包
import 下級包


import 導入模塊和包
----------------------------------------------------------
同級包的init模塊
['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']
上級包的init模塊
下級包的init模塊
導入模塊和包

導入包

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

1.sys.path一個目錄列表,供Python從中查找第三方擴展模塊
import sys
#sys.path獲取指定模塊搜索路徑的字符串集合,可以將寫好的模塊放在得到的某個路徑下,就可以在程序中import時正確找到
print(sys.path)
-------------------------------------------------------------------------------
['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',
 'E:\\python3.6.4\\lib\\site-packages', 
'E:\\pycharm\\PyCharm 2017.3.3\\helpers\\pycharm_matplotlib_backend']

sys.path
2.sys.argv
import sys
#在外部向程序內部傳遞參數sys.argv
print(sys.argv[0])# 獲取腳本名字
print(sys.argv)

for i in sys.argv:
    print(i)       # 獲取參數列表

print(len(sys.argv)-1)# 統計參數個數
------------------------------------
E:/python_work/python.3.11.py
['E:/python_work/python.3.11.py']
E:/python_work/python.3.11.py
0

sys.argv

五. __name__屬性

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

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

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

4.一個py文件直接以腳本的形式進行執行,它的名字就是__main__;若是使用模塊的形式進行加載的,他的名字是由加載的路徑
決定的:包名.子包名.模塊名    頂級名稱
def dayin():
    print('dayingg')
dayin()
if __name__ == '__main__':
   print('程序自身在運行')
else:
   print('我來自另一模塊')
---------------------------------------------------------
dayingg
程序自身在運行

dayin.py
import dayin
---------------------------------------------------------
dayingg
我來自另一模塊

六. dir() 函數

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

2.如果沒有給定參數,那麼 dir() 函數會羅列出當前定義的所有名稱
a = [1, 2, 3, 4, 5]
import dayin
print(dir(dayin))# 得到一個指定模塊中定義的名稱
print(dir())     # 得到一個當前模塊中定義的屬性列表
c=5 # 建立一個新的變量 'a'
print(dir())
del c # 刪除變量名a
print(dir())
-----------------------------------------------------
dayingg
我來自另一模塊
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__',
 'a', 'dayin']
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', 
'__spec__', 'a', 'dayin']
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', 
'__spec__', 'a', 'c', 'dayin']
['__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 要上傳的文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章