首頁 > 軟體

Python基礎之hashlib模組subprocess模組logging模組

2022-11-05 14:00:56

一、hashlib模組

什麼是雜湊模組:

hashlib模組是一種加密模組,內部存有多種加密型別

加密的作用:

可將明文資料進行加密,轉換成一串密文,密文越長說明檔案加密的越複雜

加密演演算法的種類:

  • md5
  • base64
  • hmac
  • sha系列(sha1、sha224、sha256等等)

補充說明:

1.演演算法不變,如果內容相同,那麼加密的結果肯定相同

2.待加密的明文,可以一次傳入,也可分多次傳入,不會影響密文的結果

3.加密的結果是無法反解密的

4.加鹽處理:

  • 4.1.加鹽處理的意思是指:在明文內加入干擾項,可改變密文的結果,來提高被加密的安全性
  • 4.2.動態加鹽:指干擾項是動態的,在加鹽的基礎上更大程度上提高被加密檔案的安全性

應用方向:

使用者密碼加密

  • 可應用於使用者登入時,對密碼的加密

檔案安全性校驗

  • 可對檔案進行加密,通過比對檔案的密文來判斷檔案是否被修改

基本操作與用法

匯入模組:

import hashlib

具體用法:

1、選擇加密演演算法:
    md5 = hashlib.md5()

2、傳入明文:
    md5.update(b'hello')  
   # 傳入的明文需提前轉換成二進位制的方式

3、獲取加密密文:
    res = md5.hexdigets()
    print(res)  
    # 5d41402abc4b2a76b9719d911017c592

二、subprocess模組簡介

什麼是subprocess模組:

subprocess是python內建的模組,這個模組中的Popen可以檢視使用者輸入的命令列是否存在

如果存在,把內容寫入到stdout管道中

如果不存在,把資訊寫入到stderr管道

要注意的是,這個模組的返回結果只能讓開發者看一次,如果想多次檢視,需要在第一次輸出的時候,把所有資訊寫入到變數中。

基本操作與用法

模組匯入:

import subprocess

基本格式:

subprocess.Popen('命令',
             shell = True,
             stdout = subprocess.PIPE,
             stderr = subprocess.PIPE)
  • shell=True 表示要在終端中執行的命令
  • stdout=sbuprocess.PIPE 表示當命令存在的時候,把結果寫入到stdout管道
  • stderr=sbuprocess.PIPE 表示當命令不存在的時候,把結果吸入到stderr管道

具體用法:

import subprocess
r = subprocess.Popen('xxxx', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(r.stdout.read().decode('utf8'))
print(r.stderr.read().decode('utf8'))

三、logging模組簡介

什麼是logging模組:

loggin模組是用來寫紀錄檔的,以前我們寫紀錄檔需要自己往檔案裡寫記錄資訊,使用了logging之後我們只需要一次設定好,以後寫紀錄檔的事情都不需要我們操心了,非常方便

紀錄檔的組成:

  • 產生紀錄檔
  • 過濾紀錄檔
  • 輸出紀錄檔
  • 紀錄檔格式

紀錄檔的等級:

DEBUG

  • 最詳細的紀錄檔資訊,典型應用場景是 問題診斷

INFO

  • 資訊詳細程度僅次於DEBUG,通常只記錄關鍵節點資訊,用於確認一切都是按照我們預期的那樣進行工作

WARNING

  • 當某些不期望的事情發生時記錄的資訊(如,磁碟可用空間較低),但是此時應用程式還是正常執行的

ERROR

  • 由於一個更嚴重的問題導致某些功能不能正常執行時記錄的資訊

CRITICAL

  • 當發生嚴重錯誤,導致應用程式不能繼續執行時記錄的資訊

掌握層度:

longging紀錄檔模組,內建方法與程式碼相對固定,在使用時,只需根據個人要求,對內部變數稍作修改即可使用

基本操作與用法

匯入模組:

import logging

列印紀錄檔級別:

logging.debug('Python debug')
logging.info('Python info')
logging.warning('Python warning')
logging.error('Python Error')
logging.critical('Python critical')
-------------------------------------------------------------------
WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical

當指定一個紀錄檔級別之後,會記錄大於或等於這個紀錄檔級別的紀錄檔資訊,小於的將會被丟棄, 預設情況下紀錄檔列印只顯示大於等於 WARNING 級別的紀錄檔。

程式碼用法:

import logging
logger = logging.getLogger("simple_example")
logger.setLevel(logging.DEBUG)
# 建立一個filehandler來把紀錄檔記錄在檔案裡,級別為debug以上
fh = logging.FileHandler("spam.log")
fh.setLevel(logging.DEBUG)
# 建立一個streamhandler來把紀錄檔打在CMD視窗上,級別為error以上
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 設定紀錄檔格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)
#將相應的handler新增在logger物件中
logger.addHandler(ch)
logger.addHandler(fh)
# 開始打紀錄檔
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")

紀錄檔模板:

import logging
import logging.config
# 定義紀錄檔輸出格式 開始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                  '[%(levelname)s][%(message)s]'  # 其中name為getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
# 自定義檔案路徑
logfile_path = 'a3.log'
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},  # 過濾紀錄檔
    'handlers': {
        # 列印到終端的紀錄檔
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 列印到螢幕
            'formatter': 'simple'
        },
        # 列印到檔案的紀錄檔,收集info及以上的紀錄檔
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 儲存到檔案
            'formatter': 'standard',
            'filename': logfile_path,  # 紀錄檔檔案
            'maxBytes': 1024 * 1024 * 5,  # 紀錄檔大小 5M
            'backupCount': 5,
                # 這裡兩個引數的意思是一個紀錄檔檔案最多寫5M,最多可以存在五個不同的紀錄檔檔案,但是當數量達到五個之後就會出現最早的那個會被刪除,
                # 然後再產生一個新的檔案(類似於覆蓋了最早的那個檔案)
            'encoding': 'utf-8',  # 紀錄檔檔案的編碼,再也不用擔心中文log亂碼了
        },
    },
    'loggers': {
        # logging.getLogger(__name__)拿到的logger設定
        '': {
            'handlers': ['default', 'console'],  # 這裡把上面定義的兩個handler都加上,即log資料既寫入檔案又列印到螢幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)傳遞
        },  # 當鍵不存在的情況下 (key設為空字串)預設都會使用該k:v設定
        # '購物車記錄': {
        #     'handlers': ['default','console'],  # 這裡把上面定義的兩個handler都加上,即log資料既寫入檔案又列印到螢幕
        #     'level': 'WARNING',
        #     'propagate': True,  # 向上(更高level的logger)傳遞
        # },  # 當鍵不存在的情況下 (key設為空字串)預設都會使用該k:v設定
    },
}
logging.config.dictConfig(LOGGING_DIC)  # 自動載入字典中的設定
# logger1 = logging.getLogger('購物車記錄')
# logger1.warning('尊敬的VIP客戶 晚上好 您又來啦')
# logger1 = logging.getLogger('註冊記錄')
# logger1.debug('jason註冊成功')
logger1 = logging.getLogger('紅浪漫顧客消費記錄')
# 當這裡的getLogger內部的引數如果字典中沒有,就會自動使用字典中名稱為空的那個模版來執行
logger1.debug('慢男 猛男 騷男')

以上就是Python基礎之hashlib模組subprocess模組logging模組的詳細內容,更多關於Python hashlib subprocess logging的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com