模塊概念:用一砣代碼實現了某個功能的代碼集合。 類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。 模塊分為
模塊概念:用一砣代碼實現了某個功能的代碼集合。
類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。
模塊分為三種:
1、自定義模塊
2、內置模塊
3、開源模塊
1、自定義模塊
1、導入模塊
導入模塊方法:
import module from module.xx.xx import xx from module.xx.xx import xx as rename #給導入模塊取別名 from module.xx.xx import * #導入module.xx.xx 文件中的所有函數、變數、類等
導入模塊其實就是告訴Python解釋器去解釋那個py文件
- 導入一個py文件,解釋器解釋該py文件
- 導入一個包,解釋器解釋該包下的 __init__.py 文件
導入模塊時是根據那個路徑作為基準來進行的呢?即:sys.path
import sys print(sys.path) 列印結果: ['E:\\Lab\\python\\s12\\day6', 'E:\\Lab\\python\\s12', 'E:\\Python\\Python35\\python35.zip', 'E:\\Python\\Python35\\DLLs', 'E:\\Python\\Python35\\lib', 'E:\\Python\\Python35', 'E:\\Python\\Python35\\lib\\site-packages']
#這裡會把當前運行的py文件路徑、項目根路徑、python常用變數添加到sys.path,sys.path返回的是一個列表
例子:
現在目錄結構如下:
(1)、根目錄下的 .py文件里調用子目錄 .py文件
註意:from DIR_PATH import py文件或py文件里的函數、類等
import後只能是 py文件或py文件里的
這裡也可以只導入某py文件中的某個函數等
(2)、子目錄調用另一個子目錄py包
導入包前需要把根路徑添加到path環境變數中,否則模塊將找不到而報錯,此方法僅適用於工作目錄py所在目錄,即需要在py目錄來執行運行。
pre_path = os.path.abspath('../') #獲取根的path,os.path.abspath() 這裡傳當前路徑到根路徑的相對路徑
sys.path.append(pre_path) #將根路徑追加到path環境變數中
任意工作目錄下獲取項目的根路徑:
pre_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# __file__ :獲取當前py文件的路徑
# os.path.abspath(__file__):獲取當前py文件的絕對路徑
# os.path.dirname(os.path.abspath(__file__)) :獲取當前py文件的目錄路徑
# s.path.dirname(os.path.abspath(__file__)) :獲取當前py文件的上一層的目錄路徑
2、開源模塊
下載安裝有兩種方式:
包管理工具安裝
yum
pip
apt-get
2.1 源碼安裝
下載源碼
解壓源碼
進入目錄
編譯源碼 python setup.py build
安裝源碼 python setup.py install
註:在使用源碼安裝時,需要使用到gcc編譯和python開發環境,所以先要安裝gcc及python-devvel
yum install gcc
yum install python-devel
或
apt-get python-dev
安裝成功後,模塊會自動安裝到 sys.path 中的某個目錄中,如:
/usr/lib/python2.7/site-packages/
2.2 導入模塊
導入模塊的方式同自定義模塊的導入方法
2.3 paramiko模塊
paramiko是一個用於做遠程式控制制的模塊,使用該模塊可以對遠程伺服器進行命令或文件操作,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來現實。
2.3.1 paramiko安裝
# pycrypto,由於 paramiko 模塊內部依賴pycrypto,所以先下載安裝pycrypto
# 下載安裝 pycrypto
wget http:
/
/
files.cnblogs.com
/
files
/
wupeiqi
/
pycrypto
-
2.6
.
1.tar
.gz
tar
-
xvf pycrypto
-
2.6
.
1.tar
.gz
cd pycrypto
-
2.6
.
1
python setup.py build
python setup.py install
# 進入python環境,導入Crypto檢查是否安裝成功
# 下載安裝 paramiko
wget http:
/
/
files.cnblogs.com
/
files
/
wupeiqi
/
paramiko
-
1.10
.
1.tar
.gz
tar
-
xvf paramiko
-
1.10
.
1.tar
.gz
cd paramiko
-
1.10
.
1
python setup.py build
python setup.py install
# 進入python環境,導入paramiko檢查是否安裝成功
2.3.2 paramiko使用
執行命令 - 通過用戶名和密碼連接伺服器
#!/usr/bin/env python #coding:utf-8 import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.108', 22, 'alex', '123') stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close();
執行命令--通過密鑰連接伺服器
import paramiko private_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('主機名 ', 埠, '用戶名', key) stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close()
上傳下載文件--通過用戶名和密碼
import os,sys import paramiko t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test.py','/tmp/test.py') t.close() import os,sys import paramiko t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test.py','/tmp/test2.py') t.close()
上傳下載文件--通過密鑰
import paramiko pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test3.py','/tmp/test3.py') t.close() import paramiko pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test3.py','/tmp/test4.py') t.close()
3 內置模塊
3.1 os模塊
用於提供系統級別的操作
os.getcwd() #獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname") #改變當前腳本工作目錄;相當於shell下cd
os.curdir #返回當前目錄: ('.')
os.pardir # 獲取當前目錄的父目錄字元串名:('..')
os.makedirs('dir1/dir2') #makedirs(name, mode=0o777, exist_ok=False),可遞歸生成多層目錄,相當於shell下的mkdir -p
os.removedirs('path') #若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推。如 os.makedirs('dir1/dir2'),os.removedirs('dir1/dir2'),若dir1、dir2均為空上當時,將刪除dir1及dir1/dir2
os.mkdir('path') #os.mkdir(path ,mode=0o777) 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('path') #刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir(path) #列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式列印
os.remove(path) #刪除一個文件
os.rename('src', 'dst') #重命名文件/目錄 os.renames('old', 'new') 有相同功能
os.stat(path) #獲取文件/目錄信息
os.sep #輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep #輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep #輸出用於分割文件路徑的字元串 win下為";", Linux下為":"
os.name #輸出字元串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system(command) #運行shell命令command,直接顯示並顯示執行狀態,成功為0,每執行個os.system(command)新開一個shell臨時進程
os.environ #獲取操作系統環境變數
os.path.abspath(path) #返回path規範化的絕對路徑
os.path.split(path) #將path分割成目錄和文件名二元組返回 os.path.split('path')[0] 可獲取父路徑
os.path.dirname(path) #返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) #返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) #如果path是絕對路徑,返回True
os.path.isfile(path) #如果path是一個存在的文件,返回True。否則返回False
os.path.isdir(path) # 如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) #將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略
os.path.getatime(filename) #返回path所指向的文件或者目錄的最後存取時間
os.path.getmtime(filename) 返回path所指向的文件或者目錄的最後修改時間、
os.path.getctime(filename) #返回path所指向的文件或者目錄的創建時間
os.path.getsize(filename) #返回path所指向的文件或者目錄的大小
更多猛擊這裡
3.2 sys模塊
sys.argv #獲取命令行參數List,第一個元素是程式本身路徑
sys.exit(n) #sys.exit(status=None) 退出程式,正常退出時exit(0)
sys.version #獲取Python解釋程式的版本信息
sys.maxsize #最大的Int值
sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform #返回操作系統平臺名稱.win-->'win32' linux -->'linux2'
sys.stdout.wirte('please:') #輸出
val = sys.stdin.readline()[:-1] #從行讀取並去掉回車符
更多猛擊這裡
3.3 hashlib模塊
用於加密相關的操作,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法
md5--廢棄(deprecated)
import md5 hash = md5.new() hash.update('admin') print hash.hexdigest()
#列印結果:21232f297a57a5a743894a0e4a801fc3
sha--廢棄(deprecated)
import sha hash = sha.new() hash.update('admin') print hash.hexdigest() #列印結果:d033e22ae348aeb5660fc2140aec35850c4da997
用於加密相關的操作,3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法
import hashlib m = hashlib.md5() m.update(b"Hello") m.update(b"It's me") print(m.digest()) #b']\xde\xb4{/\x92Z\xd0\xbf$\x9cR\xe3Br\x8a' m.update(b"It's been a long time since last time we ...") print(m.digest()) #2進位格式hash #b'\xa0\xe9\x89E\x03\xcb\x9f\x1a\x14\xaa\x07?<\xae\xfa\xa5' print(len(m.hexdigest())) #16進位格式hash #32 # md5 h_md5 = hashlib.md5() h_md5.update(b'admin') #python 3.x 需要轉二進位,python 2.x 直接使用h_md5.update('admin'),Unicode-objects must be encoded before hashing print(h_md5.hexdigest()) #21232f297a57a5a743894a0e4a801fc3 # sha1 h_sha1 = hashlib.sha1() h_sha1.update(b'admin') print(h_sha1.hexdigest()) #d033e22ae348aeb5660fc2140aec35850c4da997 # sha224 h_sha224 = hashlib.sha224() h_sha224.update(b'admin') print(h_sha224.hexdigest()) #58acb7acccce58ffa8b953b12b5a7702bd42dae441c1ad85057fa70b # sha256 h_sha256 = hashlib.sha256() h_sha256.update(b'admin') print(h_sha256.hexdigest()) #8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 # sha384 h_sha384 = hashlib.sha384() h_sha384.update(b'admin') print(h_sha384.hexdigest()) #9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782 # sha512 h_sha512 = hashlib.sha512() h_sha512.update(b'admin') print(h_sha512.hexdigest()) #c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec
以上加密演算法雖然依然非常厲害,但時候存在缺陷,即:通過撞庫可以反解。所以,有必要對加密演算法中添加自定義key再來做加密。
import hashlib # md5 h_m = hashlib.md5(b'mykey_1001') h_m.update(b'admin') print(h_m.hexdigest()) #f4e45c78302ae746e0b20c4ad1b889a6
還不夠叼?python 還有一個 hmac 模塊,它內部先對我們創建的key 和 內容 進行處理,然後再加密
import hmac h = hmac.new(b'jiami') h.update(b'hello') print(h.hexdigest()) #96e8ad3c5dc8c1eeb0bf510f40d0393e
更多關於md5,sha1,sha256等介紹的文章看這裡https://www.tbs-certificates.co.uk/FAQ/en/sha256.html
3.4 json 和 pickle
用於義序列化
json:用於字元串 和 python數據類型間進行轉換(可與其他語言通用)
pickle:用於python特有的類型 和 python的數據類型間進行轉換(python特有,與其他語言不通用,可把字元串、字典、函數、類等寫入文件)
json、pickle模塊都提供了4個功能:dumps、dump、loads、load
#!/usr/bin/env python # -*- coding:utf-8 -*- import json, pickle data = {'k1':123, 'k2':'hello'} ## json # json.dumps 將數據通過特殊的形式轉換為所有程式都識別的字元串 j_str = json.dumps(data) print(j_str) #{"k2": "hello", "k1": 123} # json.loads 讀取json.dumps特殊處理後的數據並返回該對象 j_str_loads = json.loads(j_str) print(j_str_loads) #{'k2': 'hello', 'k1': 123} # json.dump 將數據通過特殊的形式轉換為所有程式都識別的字元串,並寫入文件 with open('file.json', 'w') as fp: json.dump(data, fp) with open('file.json', 'r') as fp: data_j_load = json.load(fp) print(data_j_load) #{'k2': 'hello', 'k1': 123} ## pickle # pickle.dumps將數據通過特殊的形式轉換成只有python語言能識別的字元串 p_str = pickle.dumps(data) print(p_str) #b'\x80\x03}q\x00(X\x02\x00\x00\x00k2q\x01X\x05\x00\x00\x00helloq\x02X\x02\x00\x00\x00k1q\x03K{u.' # pickle.loads 讀取pickle.dumps特殊處理後的數據並返回該對象 p_loads = pickle.loads(p_str) print(p_loads) #{'k2': 'hello', 'k1': 123} # pickle.dump將數據通過特殊的形式轉換成只有python語言識別的字元串,並寫入文件 with open('file.pickle', 'wb') as fp: pickle.dump(data, fp) # pickle.loads 從文件中讀取pickle.dumps特殊處理後的數據並返回該對象 with open('file.pickle', 'rb') as fp: data_p_load = pickle.load(fp) print(data_p_load) #{'k2': 'hello', 'k1': 123}