【运维】 常用的python模块

103 阅读6分钟

记录运维工作中常用的python模块

pymsql模块

用于mysql数据库操作

import pymysql

# 连接到MySQL数据库
conn = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    database='your_database'
)

# 创建一个游标对象
cursor = conn.cursor()

# 执行查询
cursor.execute("SELECT * FROM your_table")

# 获取查询结果
results = cursor.fetchall()
for row in results:
    print(row)

# 插入数据
cursor.execute("INSERT INTO your_table (column1, column2) VALUES (%s, %s)", ('value1', 'value2'))
conn.commit()

# 更新数据
cursor.execute("UPDATE your_table SET column1 = %s WHERE column2 = %s", ('new_value', 'old_value'))
conn.commit()

# 删除数据
cursor.execute("DELETE FROM your_table WHERE column = %s", ('value_to_delete',))
conn.commit()

# 关闭游标和连接
cursor.close()
conn.close()

paramiko模块

执行ssh远程命令

import paramiko

# 连接到远程服务器
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

hostname = 'your_server_ip'
username = 'your_username'
password = 'your_password'

ssh.connect(hostname, username=username, password=password)

# 执行远程命令
stdin, stdout, stderr = ssh.exec_command('ls -l')
output = stdout.read().decode('utf-8')

print(output)

# 关闭连接
ssh.close()

上传文件

import paramiko

# 连接到远程服务器
transport = paramiko.Transport((hostname, 22))
transport.connect(username=username, password=password)

# 创建SFTP客户端
sftp = paramiko.SFTPClient.from_transport(transport)

# 上传文件
local_path = '/path/to/local/file.txt'
remote_path = '/path/to/remote/file.txt'
sftp.put(local_path, remote_path)

# 关闭连接
sftp.close()
transport.close()

下载文件

import paramiko

# 连接到远程服务器
transport = paramiko.Transport((hostname, 22))
transport.connect(username=username, password=password)

# 创建SFTP客户端
sftp = paramiko.SFTPClient.from_transport(transport)

# 下载文件
local_path = '/path/to/local/file.txt'
remote_path = '/path/to/remote/file.txt'
sftp.get(remote_path, local_path)

# 关闭连接
sftp.close()
transport.close()

tqdm

用于显示进度条,适用于长时间运行的任务

from tqdm import tqdm
import time

# 假设我们有一个任务需要迭代100次
for i in tqdm(range(100), desc="Processing", ncols=100):
    # 模拟一些耗时的操作
    time.sleep(0.01)

# 循环结束后,进度条会自动关闭

os

日志清理,递归删除文件夹下日志

# coding=utf-8
import os


def clear_log():
    # 清理日志路径
    log_path = ''
    log_list = os.listdir(log_path)
    print(log_list)
    for i in log_list:
        # 跳过不删除的文件
        if i == '':
            continue
        else:
            # 拼接字符串
            log_i_path = os.path.join(log_path, i)
            print(log_i_path)
            # 判断是文件夹,执行递归
            if os.path.isdir(log_i_path):
                clear_log(log_i_path)
            else:
                # 异常判断,无异常删除
                try:
                    os.remove(log_i_path)
                except Exception as e:
                    print(e)


if __name__ == "__main__":
    clear_log()

logging

日志模块

import logging

# 创建日志记录器
logger = logging.getLogger('example_logger')
logger.setLevel(logging.DEBUG)

# 创建控制台日志输出
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 创建日志格式
log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(log_format)

# 添加控制台日志输出
logger.addHandler(console_handler)

# 记录日志信息
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')

schdeul

定时任务调度

import schedule
import time

# 定义一个要调度的函数
def job():
    print("Job executed at", time.ctime())

# 定义一个调度器,每5秒执行一次 job
schedule.every(5).seconds.do(job)

# 主循环,用于运行待处理的定时任务
while True:
    # 检查并运行所有待处理的定时任务
    schedule.run_pending()
    # 等待一段时间,然后再次检查
    time.sleep(1)

requeset

处理get和post请求

import requests

# GET 请求
response_get = requests.get('http://example.com/api/data?key=value')
print(response_get.text)

# POST 请求
data = {'key': 'value'}
response_post = requests.post('http://example.com/api/submit', data=data)
print(response_post.status_code)

openpyxl

操作excle

写入excle数据

from openpyxl import Workbook

# 创建新工作簿
wb = Workbook()
ws = wb.active  # 获取活动工作表

# 写入数据
ws['A1'] = 'Name'
ws['B1'] = 'Age'
ws['A2'] = 'John Doe'
ws['B2'] = 30

# 保存文件
wb.save('example.xlsx')

读取excle数据

from openpyxl import load_workbook

# 加载工作簿
wb = load_workbook('example.xlsx')
ws = wb['Sheet1']  # 如果有多个工作表,可以指定名称或索引

# 读取单元格数据
name = ws['A1'].value
age = ws['B1'].value

print(f'Name: {name}, Age: {age}')

smtplib

发送电子邮箱

import smtplib
from email.message import EmailMessage

# 邮件内容
msg = EmailMessage()
msg.set_content('这是一封测试邮件。')

# 邮件头
msg['Subject'] = '测试邮件标题'
msg['From'] = '你的邮箱地址'
msg['To'] = '收件人的邮箱地址'

# SMTP 服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587  # 或者 465,取决于你的 SMTP 服务器设置
smtp_username = '你的邮箱用户名'
smtp_password = '你的邮箱密码'

# 创建 SMTP 连接
with smtplib.SMTP(smtp_server, smtp_port) as server:
    server.starttls()  # 如果需要,启用 TLS
    server.login(smtp_username, smtp_password)  # 如果需要,登录 SMTP 服务器
    server.send_message(msg)
    

下载网络图片,保存到本地

import requests
import shutil

def pic_down(image_url):
    # 计算图片保存到本地时的文件名
    pic_name = 'pic/' + image_url.split('/')[-1]

    # 发送 HTTP GET 请求并以流的形式获取响应内容
    response = requests.get(image_url, stream=True)

    # 检查响应状态码是否为 200
    if response.status_code == 200:
        # 使用 with 语句打开文件并以二进制写入模式保存图片
        with open(pic_name, 'wb') as f:
            shutil.copyfileobj(response.raw, f)

    # 打印下载成功消息
    print('Image downloaded successfully.')
    
 
 

try-except

异常处理

def divide(x, y):
    try:
        # 尝试执行除法操作
        result = x / y
    except ZeroDivisionError:
        # 如果除数为零,捕获 ZeroDivisionError 异常
        print("Error: Division by zero is not allowed.")
    except Exception as e:
        # 捕获其他未预料到的异常
        print(f"An unexpected error occurred: {e}")
    else:
        # 如果没有发生异常,执行这里的代码
        print(f"The result of the division is: {result}")
    finally:
        # 无论是否发生异常,都会执行这里的代码
        print("Execution of the divide function is complete.")

# 调用函数
divide(10, 2)  # 正常情况
divide(10, 0)  # 除数为零的情况
divide("10", 2)  # 类型错误的情况

redis

对redis操作

import redis

# 连接到本地的 6379 端口(默认配置)
r = redis.Redis(host='localhost', port=6379, db=0,password='')

# 存储键值对(键为 "key", 值为 "value")
r.set("key", "value")

# 获取键的值
value = r.get("key")
print(value)

# 设置键值对,过期时间为 10 秒
r.setex("key", 10, "new_value")

# 向列表添加元素
r.rpush("list_name", "element1", "element2")

# 从列表左侧弹出元素
first_element = r.lpop("list_name")
print(first_element)

# 获取列表的一部分
elements = r.lrange("list_name", 0, -1)
print(elements)


# 向集合添加元素
r.sadd("set_name", "element1", "element2")

# 获取集合中的所有元素
elements = r.smembers("set_name")
print(elements)

# 存储哈希中的键值对
r.hset("hash_name", "key1", "value1")

# 获取哈希中的值
value = r.hget("hash_name", "key1")
print(value)

sockert

检测ip,端口可达性

import socket
# 定义检测 IP 地址和端口是否可达的函数
def get_port(socket_ip, socket_port):
    # 创建一个 TCP 套接字
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置超时时间为 3 秒
    s.settimeout(3)
    # 尝试连接指定的 IP 地址和端口
    socket_result = s.connect_ex((socket_ip, socket_port))
    # 关闭套接字
    s.close()
    # 返回连接结果
    return socket_result
    
    
    

重启jar包服务

 # 定义要使用的端口号
port = 8001
# 构建查找并关闭指定端口的命令
find_port = 'fuser -k -n tcp %s' % port
try:
    # 执行关闭指定端口的命令,并获取输出结果
    result = os.popen(find_port)
    text = result.read()
    # 打印输出结果
    print(text)
except Exception as e:
    # 如果执行关闭端口命令出现异常,记录异常信息到日志文件
    file1 = open("logs.txt", "a")
    file1.write('\\n' + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + '     kill port8001')
    file1.close()

# 启动一个 Java 应用程序监听指定端口
os.system(
    'nohup java -jar app.jar --server.port=8001 --capture.group=1 --capture.thread=10 >/dev/null 2>&1 &')
# 打印执行成功信息
print('执行成功8001')

zipfile

zip压缩解压文件

import zipfile


def creat_zip():
    # 创建一个新的 ZIP 文件
    with zipfile.ZipFile('archive.zip', 'w') as zipf:
        # 将文件添加到 ZIP 文件中
        zipf.write('123')
        zipf.write('1231')
        # 可以指定压缩级别


def read_zip():
    with zipfile.ZipFile('archive.zip', 'r') as zipf:
        # 打印 ZIP 文件中的所有文件名
        for filename in zipf.namelist():
            print(filename)


def tar_zip():
    # 打开一个现有的 ZIP 文件
    with zipfile.ZipFile('archive.zip', 'r') as zipf:
        # 解压缩所有文件到当前目录
        zipf.extractall()