1. 程式人生 > >03-Python-包&模組-包和模組的一般操作

03-Python-包&模組-包和模組的一般操作

學習地址:

撩課-Python大資料+人工智慧1
撩課-Python大資料+人工智慧2
撩課-Python大資料+人工智慧3
撩課-Python大資料+人工智慧4
撩課-Python大資料+人工智慧5
撩課-Python大資料+人工智慧6
撩課-Python-GUI程式設計-PyQt5

1.包/模組的建立

建立模組

 直接建立一個.py檔案即可

建立包

  建立一個資料夾, 資料夾內務必建立一個__init__.py這個檔案
  其實3.3版本往後可以不用建立
  但是為了程式碼版本相容, 以及做一些其他包處理操作, 目前還是建議建立
  __init__.py檔案作用
  第一次匯入這個包的時候, 都會自動的執行這個檔案

建立多層級包

			在包裡面直接建立另外一個包即可, 可以無限級巢狀

包/模組的基本資訊

		包和模組名稱
			模組名稱
				去除.py字尾名後的檔名稱
				例如
					sz.py
						是一個模組
					模組名稱是
						sz

包名

      資料夾名稱
		包和模組的存放位置
			import os
			print(os.__file__)
				會列印os模組所在路徑
		檢視包和模組裡面的內容
			dir(模組/包名稱)
	匯入包/模組的方式
		友情提醒
			這一塊知識點本身比較碎; 需要自己多做實驗慢慢體會掌握

理論基礎

	匯入模組的作用
	可以使用這個模組裡面的內容

2.常規匯入

			方式
				import M
					匯入單個模組
					解釋
						M
							模組
							如果是某個包裡的模組, 可以通過點語法來定位
				import M1, M2
					匯入多個模組
					解釋
						M1
							模組
								如果是某個包裡的模組, 可以通過點語法來定位
						M2
							模組
								如果是某個包裡的模組, 可以通過點語法來定位
				import M as 別名
					匯入模組時,給模組起個別名
					應用場景
						簡化資源訪問字首
							例如
								原始碼
									呼叫資源時
										xx1.xx2.xx3.xx4.資源
									import xx1.xx2.xx3.xx4
								優化後
									import xx1.xx2.xx3.xx4 as hehe
									呼叫資源時
										hehe.資源
						增加程式的擴充套件性
							例如
								if file_extension == "txt":
	import txt_parse
	txt_parse.open()
	txt_parse.read()
	txt_parse.close()
elif file_extension == "doc":
	import doc_parse
	doc_parse.open()
	doc_parse.read()
	doc_parse.close()
								優化後
									if file_extension == "txt":
	import txt_parse as parse
elif file_extension == "doc":
	import doc_parse as parse

parse.open()
parse.read()
parse.close()
			注意
				使用時,需要指明資源的模組名稱
					例如:p1.my_moudle.run()
			補充
				如果匯入的是一個包
					預設不會匯入任何模組
					解決方案
						1. 在__init__檔案中, 再次匯入需要的模組
						2. 應該以from ... import ... 的形式匯入

from語句匯入

			作用
				想要匯入一個模組或包中的某個部分
				從哪裡, 匯入哪些資源到當前位置
			語法
				from A import B [as C]
					理論(sz)
						明確一點
							只能從大的地方找小的東西
							從盆裡面找碗是可以
							反之, 從碗裡面找盆就有問題
						按照大小順序可以將幾個資源排序
							包 > 模組 > 模組資源
						注意面向關係
							模組裡面只能看到模組資源
					最終組合
						包裡面只能看到模組
							看不到模組資源
						1. 從包中匯入模組
							單個
							多個
							起別名
							包有多層級
						2. 從模組中匯入模組資源
							單個
							多個
							起別名
							模組有多層級
					注意
						保證B部分路徑最簡
							原則: 從那裡能看到誰才能匯入誰
						舉個栗子
							from 大包 import 小包.模組
								from 大包.小包 import 模組
							from 包 import 模組.子資源
								from 包.模組 import 子資源
			特例
				from 模組 import *
					* 代表是所有非下劃線_開頭資源匯入到當前位置
					配合__all__
						是一個列表
							__all__ = ["a", "run", "Person"]
							列表中每個元素都是字串
						代表到時*能匹配到的資源
					慎用
						因為你無法預知到時會匯入哪些內容到當前位置,容易產生變數名衝突
				from 包 import *
					會識別__init__檔案中__all__列表中的指定模組

注意

			1. 匯入模組後具體做了什麼事?
				第一次匯入時
					1. 在自己當下的名稱空間中, 執行所有程式碼
					2. 建立一個模組物件, 並將模組內所有頂級變數以屬性的形式繫結在模組物件上
					3. 在import的位置, 引入import後面的變數名稱到當前名稱空間
				第二次匯入時
					直接執行上述第3步
				結論
					注意: 兩種匯入方式都會大致執行以上的步驟
					1. 多次匯入模組, 該模組並不會執行多次
					2. 兩種匯入方式不存在哪一種更省記憶體
						區別在於把哪一部分內容拿到當前位置來用
			2. 從哪個位置找到需要匯入的模組?
				第一次匯入時
					按照模組檢索路徑順序去找
						第一級
							內建模組
						第二級
							sys.path
								構成
									當前目錄
										import os
										os.getcwd()
									環境變數 PYTHONPATH 中指定的路徑列表
									特定路徑下的.pth檔案中的檔案路徑列表
										檢視特定路徑
											import site
											print(site.getsitepackages())
										字尾名為.pth檔案
											名稱隨意
											一個路徑佔一行
									在 Python 安裝路徑的 lib 庫中搜索
								注意
									自己測試優先順序順序
							追加路徑的方式
								1. 直接修改sys.path
									只作用於本次
								2. 修改環境變數
									PYTHONPATH
									注意
										僅僅在shell中有效
										pycharm需要另外一種設定方式
								3. 新增.pth檔案
				第二次匯入時
					從已經載入過的模組中去找
					檢視已載入模組
						import sys
						sys.modules
			3. 匯入模組的常見場景?
				區域性匯入
					在某個區域性範圍內匯入模組
						在其他範圍無法使用
					所以,如果想要全域性範圍都能使用,在檔案頂部匯入相關模組
					使用場景
						當一個模組使用並不頻繁, 而且匯入時間過長時
				覆蓋匯入
					場景1
						自定義模組和非內建的標準模組重名
							根據前者儲存位置, 有可能前者會覆蓋後者
						結論
							自定義模組命名不要與後者重名
					場景2
						自定義模組和內建模組重名
							內建肯定覆蓋自定義
						你又特別想用自定義模組
							使用from...import... 指明絕對路徑進行匯入
				迴圈匯入
					假設有兩個模組A, B
					模組A內匯入了模組B; 模組B內也匯入了模組A;這樣就造成了迴圈匯入
				可選匯入
					概念
						兩個功能相近的包, 根據需求優先選擇其中一個匯入
					場景
						有兩個包A和B都可以實現相同的功能
						想優先使用A; 而且需要做到在沒有A的情況下, 使用B做備選
					實現
						使用try...except...進行實現
				包內匯入
					絕對匯入和相對匯入
						理論
							Python 相對匯入與絕對匯入,這兩個概念是相對於包內匯入而言的
							包內匯入即是包內的模組匯入包內部的模組
						概念
							絕對
								參照sys.path路徑進行檢索
								例如
									指明包名或模組名
										import a
										from a import b
								注意
									以上結論基於Python3.x之後
							相對
								使用.來指代相對路徑
									.
										根據模組名稱所獲取的當前目錄
									..
										根據模組名稱所獲取的上層目錄
								例如
									from . import a
									from .. import a
								注意
									直譯器是根據模組名稱而確定層級關係, 並不是存放目錄
									可以通過__name__來檢視模組名稱
						補充
							Python3.x版本之前, 直接import a
								優先從本地當前目錄查詢, 並非是sys.path
								解決方案
									from __future__ import absolute_import
									使用上述語句, 改變import 行為
						結論
							正確用法
								包內匯入
									使用相對匯入
								包外匯入
									使用絕對匯入

三方包/模組的安裝和升級

		理論
			1. 為什麼要安裝三方模組?
				因為標準模組有時不能滿足我們的需求
			2. 三方模組和標準模組的區別和聯絡?
				首先,兩者都是為了完成某個功能需求
				標準模組
					由官方釋出
					使用可靠,幾乎沒有bug,即使有也有團隊立即修復
					有健全的使用文件說明
				三方模組
					由網友提供,可能有如下缺點
					文件不健全
					更新不及時或者根本不更新
					功能有bug
			3. 為什麼標準模組不做的超級全?
				每個人的需求不同,做並集會導致整個檔案非常龐大,你願意一次性下載好幾個G而且有可能根本用不到檔案嗎?
				所以,做了需求的交集;大多數人都需要的功能被放到了標準模組
			4. 什麼叫模組的安裝?
				三方模組本質就是別人寫的程式碼
				所謂安裝,就是想辦法把這個程式碼搞到本地,讓我們可以來用
			5. 安裝的方式?
				原始碼安裝
					自己手動去某個地方去下載,然後安裝到本地
				包管理器安裝
					更加簡單的自動化的為使用者安裝管理包和模組
					只需要一個或幾個命令就可以完成
			6. 包管理專案簡史
				distutils
					產生背景
						三方庫的存在是必然
						為了讓使用者更好的使用和管理三方庫,官方就開發了這個專案
						1998-2000
					角色定位
						屬於Python標準庫(官方發行)
					功能特點
						只需要通過合適的命令執行一個叫做setup.py的檔案即可
						只能處理簡單的包安裝
				setuptools
					產生背景
						自從distutils開發停止之後,一些開發人員在它的基礎之上進行開發自己的工具
						其中最成功的的就是setuptools
							說明還有其他很多不太成功的
					角色定位
						屬於三方庫
					功能特點
						更加頻繁的更新
						更多的高階功能
							自動依賴處理
							egg分發格式
							easy_install命令
						與distutils的相容
				distribute
					產生背景
						setuptools開發變緩慢了(不支援Python3),以為會如同distutils一樣停止開發
						另一批開發人員又基於setuptools(fork)建立了名為distribute的庫
					角色定位
						依然是三方庫
					功能特點
						bug更少
						支援Python3
					現狀
						2013年setuptools和distribute兩個開發組織決定再次合併到setuptools專案中
						所以,distribute被廢棄
							setuptools又成了正主
				...
					目前為止有很多包管理工具
						disutils2
						distlib
						...
					但是官方支援的且認可度高的就兩個
						distutils
							官方標準庫
							從python2 到python3.6全部內建支援
						setuptools(合併distribute後的)
							三方庫
							部分 Python 子社群已然是事實上的標準
					更多包管理專案請看
						https://packaging.python.org/key_projects/
				總結
					distutils
						是標準庫的一部分
							能處理簡單的包的安裝
						通過setup.py進行安裝
					setuptools
						現在的包安裝標準
							曾經差點被廢棄,現在有繼續開發
						自帶了一個easy_install 安裝指令碼
							後來出現個更牛逼的pip安裝指令碼來替代它
						引入了.egg格式
							後來出現個更好的whl格式來代替它
					setuptools是目前的主要選擇
			7. 常見已釋出三方包和模組的形式?
				原始碼
					單檔案模組
					多檔案模組(由包管理工具釋出的專案)
						基於distutils工具釋出的專案特點
							包含setup.py檔案
						setuptools也是基於distutils
				.egg
					setuptools引入的一種格式
					setuptools可以識別它,安裝它
				.whl
					本質是.zip格式
					是為了替代egg
			8. 安裝方式
				本地安裝
					對於單檔案模組
						直接拷貝到相關資料夾就可以
					對於帶setup.py的檔案
						通過setup.py 指令碼即可安裝
					.egg檔案
						使用setuptools的自帶的安裝指令碼 easy_install進行安裝
					.whl
						使用pip進行安裝
				遠端安裝
					easy_install
					pip
					pycharm
				安裝源
					Python官方
						https://pypi.python.org/simple
					豆瓣
						http://pypi.douban.com/simple/
					阿里
						http://mirrors.aliyun.com/pypi/simple/
					中國科學技術大學
						https://pypi.mirrors.ustc.edu.cn/simple/
					伺服器在國外,所以國內訪問有可能非常慢,網路不好
					映象地址,伺服器在國內,所以網路比較通暢,速度快!

模組安裝的具體操作

			本地安裝
				對於單檔案模組
					直接拷貝到相關資料夾就可以
					存放位置
						sys.path中所包含的路徑都可以
						一般存放在Lib/site-package資料夾中
				對於帶setup.py的檔案
					步驟1
						開啟命令列工具
					步驟2
						切換到setup.py檔案所在的目錄
					步驟3
						執行命令python setup.py install
							Python2.x
						執行命令python3 setup.py install
							Python3.x
					注意
						如果專案是使用distutils打包的,上述命令可以直接使用
							因為distutils是Python自帶模組,不需要安裝
						如果專案是使用setuptools打包的,有可能上述命令會報錯
							錯誤
								
							原因
								setuptools屬於三方模組,並非標準模組,所以有可能沒有安裝
							解決方案
								安裝setuptools
						離線安裝
							但是有時候, 包, 依賴的三方包
							依然需要聯網, 讓它自動的給我們下載安裝這些三方的包
				.egg檔案
					使用setuptools的自帶的安裝指令碼 easy_install進行安裝
						要求先安裝setuptools
					語法
						easy_install xxx.egg
				.whl
					使用easy_install安裝
						語法
							easy_install xxx.whl
					使用pip進行安裝
						推薦
						安裝pip
							通過easy_install 遠端或者本地安裝
							遠端
								easy_install pip
								自動下載,自動安裝
							本地
								.egg
								.whl
								.tar.gz
						語法
							pip install xxx.whl
			遠端安裝
				概念
					自動的從遠端地址檢索->下載->安裝某個模組
				安裝方式
					easy_install xxx
						需要先安裝setuptools
					pip install xxx
						需要先安裝pip
				疑問
					從哪個地方下載的包安裝到本地的?
						預設:https://pypi.python.org/
					安裝在本地的哪個地方了?
						一般在Lib/site_packages

模組的其他操作

easy_install

			詳細介紹地址
				http://peak.telecommunity.com/DevCenter/EasyInstall
			其他常用操作
				多個Python版本的切換安裝
					場景
						如果一臺電腦上,既裝了Python2.x 也裝了 Python3.x
							兩個版本環境都裝了setuptools, 都可以使用easy_install
						那麼,到時候,如何通過easy_install 安裝到指定版本的環境中?
					解決方案
						easy_install-N.N
							N.N用於指明安裝在哪個Python版本環境中
						例如
							Python2.7.14
								easy_install-2.7 requests
							Python3.6.3
								easy_install-3.6 requests
				安裝指定版本包
					場景
						如果一個包有多個版本;而有的專案使用的是某個特定版本,那該如何安裝?
					解決方案
						easy_install “庫名 限定符 版本[, 限定符 版本]”
							中括號部分代表可選
							庫名
								包的名稱
							限定符
								<
								>
								<=
								>=
								==
						例如
							easy_install "requests >= 2.14.1"
								安裝大於或等於2.14.1版本的最新包
							easy_install "requests > 1.0, < 2.0"
								安裝大於1.0 並且小於 2.0的包
							easy_install "requests == 2.14.1"
								安裝2.14.1版本的包
								如果已經安裝,則切換到這個版本
							...
				升級三方包
					場景
						有些包的作者,修復了之前的某個Bug; 本地需要更新到最新版本
					解決方案
						easy_install --upgrade(-U) 庫名
						例如
							easy_install --upgrade requests
				解除安裝三方包
					場景
						有些已經安裝的包,因某些原因,想要刪除(比如:使用這個包的專案已經不需要)
					解決方案
						方式1:手動解除安裝
							刪除在easy_install.pth中的包記錄
							刪除對應的包檔案
						方式2:easy_install -m 包名稱
							效果
								刪除在easy_install.pth檔案中對應包的記錄
							注意
								並沒有真正的把.egg包檔案刪除
									不刪除原因
										方便多版本切換
									強迫症選手可以選擇手動刪除
								不會刪除依賴包
									本身也不應該刪除
									因為這個依賴包,有可能也被其他三方包依賴
						補充
							easy_install.pth作用
								記錄著當前通過easy_isntall已經安裝的模組
									多個版本的模組,值記錄最後一次安裝的
								用於匯入模組時的路徑檢索
							-m的真正含義
								支援多版本,可在執行時進行切換
									easy_install.pth 對應的庫的記錄刪除
								解釋
									不直接指明包的某個版本,使得使用者無法直接匯入
										刪除在easy_install.pth檔案中對應包的記錄
									使用者如果想使用某個版本,需要使用如下步驟
										import pkg_resources
										pkg_resources.require("requests==2.18.4")
										import requests
				切換三方安裝源
					場景
						有可能Python官方庫的託管平臺,伺服器在國外的原因,會導致安裝速度慢,甚至失敗
					解決方案
						easy_install修改檔案
							setuptools\command\easy_install.py
								
						安裝源
							Python官方
								https://pypi.python.org/simple
							豆瓣
								http://pypi.douban.com/simple/
							阿里
								http://mirrors.aliyun.com/pypi/simple/
							中國科學技術大學
								https://pypi.mirrors.ustc.edu.cn/simple/
							伺服器在國外,所以國內訪問有可能非常慢,網路不好
							映象地址,伺服器在國內,所以網路比較通暢,速度快!

pip

			詳細介紹地址
				https://pip.pypa.io/en/stable/
			其他常用操作
				切換安裝源
					一次性修改
						pip install --index-url https://pypi.douban.com/simple/ requests
							指定檢索
							僅僅只到某一個地址檢索指定包
						pip install --extra-index-url https://pypi.douban.com/simple/ requests
							擴充套件檢索
							除下到官方的pypi地址檢索,也會到擴充套件的地址檢索
					永久性修改
						在c://users/你的使用者名稱/下
							建立pip資料夾
							在pip資料夾中建立pip.ini檔案
						檔案內容
							[global]
							index-url = http://pypi.douban.com/simple/
							[install]
							trusted-host=pypi.douban.com
					安裝源
						Python官方
							https://pypi.python.org/simple
						豆瓣
							http://pypi.douban.com/simple/
						阿里
							http://mirrors.aliyun.com/pypi/simple/
						中國科學技術大學
							https://pypi.mirrors.ustc.edu.cn/simple/
						伺服器在國外,所以國內訪問有可能非常慢,網路不好
						映象地址,伺服器在國內,所以網路比較通暢,速度快!
				安裝在不同的Python版本環境中
					方式1
						python -m pip install requests
						python3 -m pip install requests
					方式2
						py -2 -m pip install requests
						py -3 -m pip install requests
					理論
						Python的安裝包實際上在系統中安裝了一個啟動器py.exe
							C:\Windows\py.exe
						啟動器可以呼叫不同版本的Python去執行某些指令碼
							py -2
							py -3
				檢視包
					所有已經安裝的
						pip list
					不被依賴的包
						pip list --not-required
					過期的包
						pip list --outdated
					檢視某個包的具體資訊
						pip show xxx
				搜尋包
					pip search xxx
					pip search -i 檢索地址 xxx
						預設為Python官方的庫地址
						 https://pypi.python.org/simple
					例如
						pip search peppercorn
				安裝特定版本
					pip install "requests == 2.18"
					pip install "requests >= 2.0"
					pip install "requests > 2.0, < 3.0"
				升級包
					pip install --upgrade xxx
					注意
						pip install xxx
						表示:只有當xxx庫不存在的時候,才會安裝最新版本
				解除安裝包
					pip uninstall xxx
						如果是通過easy_install安裝的
							會自動刪除easy_install.pth檔案中對應包路徑
							會自動刪除對應.egg包的原檔案
						如果是通過pip install 安裝的,會直接刪除對應包檔案
				生成凍結需求文字
					場景
						可以將當前安裝的三方包記錄,儲存到指定的檔案當中
						以後,就可以根據這個需求文字,去安裝三方包
					用法
						pip freeze > requirements.txt
							用來將當前環境下安裝的三方包輸出到指定檔案中
							因為輸出的檔案,以後是為了讓別人通過pip安裝
							所以,能看到的列表中自動過濾了pip, setuptools
							可通過 --all引數檢視所有包
				根據凍結需求文字安裝
					pip install -r requirements.txt

補充

			三方模組的版本規則
			三部分組成n1.n2.n3
				n3
					當版本的bug修復之後,n3 + 1
				n2
					新增了某一個小功能
						n2 + 1
				n1
					修改了之前的功能,或者, 添加了一個新功能(修改了之前的api)
					n1 + 1
			1. 我釋出了一個庫
				1.0.0
			2.之前釋出的庫, 出現了一個bug, 然後我再本地修復了這個bug, 並且進行再次的釋出
				1.0.1
			3. 往後, 在這個庫裡面, 新增了一個小功能
				1.1.0
			4.發現1.1.0版本出現了一個bug, 修復 -》 釋出
				1.1.1
			4. 新增一個小功能
				1.2.0
			6. 釋出了一個超級大的功能, api, 釋出
				2.0.0