Python模塊基礎(chǔ)
模塊,用一砣代碼實(shí)現(xiàn)了某個(gè)功能的代碼集合。
類似于函數(shù)式編程和面向過(guò)程編程,函數(shù)式編程則完成一個(gè)功能,其他代碼用來(lái)調(diào)用即可,提供了代碼的重用性和代碼間的耦合。而對(duì)于一個(gè)復(fù)雜的功能來(lái),可能需要多個(gè)函數(shù)才能完成(函數(shù)又可以在不同的.py文件中),n個(gè) .py 文件組成的代碼集合就稱為模塊。
如:os 是系統(tǒng)相關(guān)的模塊;file是文件操作相關(guān)的模塊
模塊分為三種:
- 自定義模塊
- 內(nèi)置模塊
- 開源模塊
自定義模塊
1、定義模塊
情景一:
情景二:
情景三:
2、導(dǎo)入模塊
Python之所以應(yīng)用越來(lái)越廣泛,在一定程度上也依賴于其為程序員提供了大量的模塊以供使用,如果想要使用模塊,則需要導(dǎo)入。導(dǎo)入模塊有一下幾種方法:
import modulefrom module.xx.xx import xxfrom module.xx.xx import xx as rename from module.xx.xx import *
導(dǎo)入模塊其實(shí)就是告訴Python解釋器去解釋那個(gè)py文件
- 導(dǎo)入一個(gè)py文件,解釋器解釋該py文件
- 導(dǎo)入一個(gè)包,解釋器解釋該包下的 __init__.py 文件
那么問(wèn)題來(lái)了,導(dǎo)入模塊時(shí)是根據(jù)那個(gè)路徑作為基準(zhǔn)來(lái)進(jìn)行的呢?即:sys.path
import sys print sys.path 結(jié)果: ['E:\\Python\\\xc1\xb7\xcf\xb0', 'E:\\Python', 'C:\\Windows\\SYSTEM32\\python27.zip', 'D:\\Install\\Python\\DLLs', 'D:\\Install\\Python\\lib', 'D:\\Install\\Python\\lib\\plat-win', 'D:\\Install\\Python\\lib\\lib-tk', 'D:\\Install\\Python', 'D:\\Install\\Python\\lib\\site-packages']如果sys.path路徑列表沒有你想要的路徑,可以通過(guò) sys.path.append('路徑') 添加。
通過(guò)os模塊可以獲取各種目錄,例如:
import sys import os pre_path = os.path.abspath('../') sys.path.append(pre_path)
開源模塊
一、下載安裝
下載安裝有兩種方式:
yum pip apt-get ...
下載源碼 解壓源碼 進(jìn)入目錄 編譯源碼 python setup.py build 安裝源碼 python setup.py install注:在使用源碼安裝時(shí),需要使用到gcc編譯和python開發(fā)環(huán)境,所以,需要先執(zhí)行:
yum install gcc yum install python-devel 或 apt-get python-dev安裝成功后,模塊會(huì)自動(dòng)安裝到 sys.path 中的某個(gè)目錄中,如:
/usr/lib/python2.7/site-packages/
二、導(dǎo)入模塊
同自定義模塊中導(dǎo)入的方式
三、模塊 paramiko
paramiko是一個(gè)用于做遠(yuǎn)程控制的模塊,使用該模塊可以對(duì)遠(yuǎn)程服務(wù)器進(jìn)行命令或文件操作,值得一說(shuō)的是,fabric和ansible內(nèi)部的遠(yuǎn)程管理就是使用的paramiko來(lái)現(xiàn)實(shí)。
1、下載安裝
# pycrypto,由于 paramiko 模塊內(nèi)部依賴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 # 進(jìn)入python環(huán)境,導(dǎo)入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 # 進(jìn)入python環(huán)境,導(dǎo)入paramiko檢查是否安裝成功2、使用模塊
#!/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('主機(jī)名 ', 端口, '用戶名', 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() 上傳或者下載文件 - 通過(guò)用戶名和密碼
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() 上傳或下載文件 - 通過(guò)密鑰
內(nèi)置模塊
一、os
用于提供系統(tǒng)級(jí)別的操作
os.getcwd() 獲取當(dāng)前工作目錄,即當(dāng)前python腳本工作的目錄路徑 os.chdir("dirname") 改變當(dāng)前腳本工作目錄;相當(dāng)于shell下cd os.curdir 返回當(dāng)前目錄: ('.') os.pardir 獲取當(dāng)前目錄的父目錄字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('dirname1') 若目錄為空,則刪除,并遞歸到上一級(jí)目錄,如若也為空,則刪除,依此類推 os.mkdir('dirname') 生成單級(jí)目錄;相當(dāng)于shell中mkdir dirname os.rmdir('dirname') 刪除單級(jí)空目錄,若目錄不為空則無(wú)法刪除,報(bào)錯(cuò);相當(dāng)于shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印 os.remove() 刪除一個(gè)文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息 os.sep 輸出操作系統(tǒng)特定的路徑分隔符,win下為"\\",Linux下為"/" os.linesep 輸出當(dāng)前平臺(tái)使用的行終止符,win下為"\t\n",Linux下為"\n" os.pathsep 輸出用于分割文件路徑的字符串 os.name 輸出字符串指示當(dāng)前使用平臺(tái)。win->'nt'; Linux->'posix' os.system("bash command") 運(yùn)行shell命令,直接顯示 os.environ 獲取系統(tǒng)環(huán)境變量 os.path.abspath(path) 返回path規(guī)范化的絕對(duì)路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實(shí)就是os.path.split(path)的第一個(gè)元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\結(jié)尾,那么就會(huì)返回空值。即os.path.split(path)的第二個(gè)元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是絕對(duì)路徑,返回True os.path.isfile(path) 如果path是一個(gè)存在的文件,返回True。否則返回False os.path.isdir(path) 如果path是一個(gè)存在的目錄,則返回True。否則返回False os.path.join(path1[, path2[, ...]]) 將多個(gè)路徑組合后返回,第一個(gè)絕對(duì)路徑之前的參數(shù)將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最后存取時(shí)間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時(shí)間
二、sys
用于提供對(duì)解釋器相關(guān)的操作
sys.argv 命令行參數(shù)List,第一個(gè)元素是程序本身路徑 sys.exit(n) 退出程序,正常退出時(shí)exit(0) sys.version 獲取Python解釋程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值 sys.platform 返回操作系統(tǒng)平臺(tái)名稱 sys.stdout.write('please:') val = sys.stdin.readline()[:-1] SYS模塊
三、hashlib
用于加密相關(guān)的操作,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import md5 hash = md5.new() hash.update('admin') print hash.hexdigest()
import sha hash = sha.new() hash.update('admin') print hash.hexdigest()
import hashlib # ######## md5 ######## hash = hashlib.md5() hash.update('admin') print hash.hexdigest() # ######## sha1 ######## hash = hashlib.sha1() hash.update('admin') print hash.hexdigest() # ######## sha256 ######## hash = hashlib.sha256() hash.update('admin') print hash.hexdigest() # ######## sha384 ######## hash = hashlib.sha384() hash.update('admin') print hash.hexdigest() # ######## sha512 ######## hash = hashlib.sha512() hash.update('admin') print hash.hexdigest()以上加密算法雖然依然非常厲害,但時(shí)候存在缺陷,即:通過(guò)撞庫(kù)可以反解。所以,有必要對(duì)加密算法中添加自定義key再來(lái)做加密。
import hashlib # ######## md5 ######## hash = hashlib.md5('898oaFs09f') hash.update('admin') print hash.hexdigest()還不夠厲害?python 還有一個(gè) hmac 模塊,它內(nèi)部對(duì)我們創(chuàng)建 key 和 內(nèi)容 再進(jìn)行處理然后再加密
import hmac h = hmac.new('wueiqi') h.update('hellowo') print h.hexdigest()