当前位置: 首页 > article >正文

十四:Python学习笔记--基础知识完结(12)写几个案例 打包exe出来 齐活

目录

案例一:系统监控工具

案例二: 假设 多台电脑  在局域网中 只有一台电脑可以连接外网, 内网的数据必须要传递到外网电脑

内网:

外网:

程序打包


案例一:系统监控工具

  • 加载配置:从 config.json 文件中读取要监控的端口列表。

  • 端口检查:检查指定的端口是否正在被使用。

  • 系统信息收集

    • CPU 信息:获取 CPU 使用率和核心数。
    • 内存信息:获取虚拟内存和交换内存的状态。
    • 磁盘信息:列出所有磁盘分区及其使用情况,包括总容量、已用容量、剩余容量和使用率。
    • 网络信息:获取网络 I/O 统计和网络接口的地址信息。
    • 进程数量:统计当前运行的进程数量。
  • 循环监控:每五秒钟重复获取并打印上述系统信息,同时监控指定端口的状态,输出每个端口的运行状态。

  • 异常处理:在数据收集和打印过程中捕获并输出可能发生的错误。

import sys
import psutil
import time
import json
import os


def load_config():
    # 获取 .exe 所在目录的路径
    base_path = os.path.dirname(os.path.abspath(sys.argv[0]))
    config_path = os.path.join(base_path, 'config.json')

    # 检查配置文件是否存在
    if not os.path.exists(config_path):
        print(f"配置文件 {config_path} 未找到!")
        return []

    # 读取配置文件内容
    with open(config_path, 'r') as f:
        config = json.load(f)
    return config.get("monitor_ports", [])


def is_port_in_use(port):
    # 检查指定端口是否在使用
    for conn in psutil.net_connections(kind='inet'):
        if conn.laddr.port == port and conn.status == psutil.CONN_LISTEN:
            return True
    return False

def get_system_info():
    monitor_ports = load_config()  # 加载要监控的端口

    while True:
        try:
            # 获取 CPU 信息
            cpu_percent = psutil.cpu_percent(interval=1)
            cpu_count = psutil.cpu_count(logical=True)

            # 获取内存信息
            virtual_memory = psutil.virtual_memory()
            swap_memory = psutil.swap_memory()

            # 获取磁盘信息
            disk_partitions = psutil.disk_partitions()
            disk_info = []
            for partition in disk_partitions:
                partition_usage = psutil.disk_usage(partition.mountpoint)
                disk_info.append({
                    'device': partition.device,
                    'mountpoint': partition.mountpoint,
                    'fstype': partition.fstype,
                    'total': partition_usage.total,
                    'used': partition_usage.used,
                    'free': partition_usage.free,
                    'percent': partition_usage.percent,
                })

            disk_io = psutil.disk_io_counters()

            # 获取网络信息
            net_io = psutil.net_io_counters()
            net_if_addrs = psutil.net_if_addrs()

            # 获取进程数量
            process_count = len(psutil.pids())

            # 打印系统信息
            print("\n=== 系统信息 ===")
            print(f"CPU 使用率: {cpu_percent}%")
            print(f"CPU 核心数: {cpu_count}")
            print(f"虚拟内存: {virtual_memory}")
            print(f"交换内存: {swap_memory}")

            # 打印磁盘信息
            print("\n=== 磁盘信息 ===")
            for info in disk_info:
                print(f"设备: {info['device']}")
                print(f"挂载点: {info['mountpoint']}")
                print(f"文件系统类型: {info['fstype']}")
                print(f"总容量: {info['total'] / (1024 ** 3):.2f} GB")
                print(f"已使用: {info['used'] / (1024 ** 3):.2f} GB")
                print(f"剩余: {info['free'] / (1024 ** 3):.2f} GB")
                print(f"使用率: {info['percent']}%")
                print("----------")

            print(f"磁盘 I/O: 读 {disk_io.read_count}, 写 {disk_io.write_count}, 读字节 {disk_io.read_bytes}, 写字节 {disk_io.write_bytes}")

            # 打印网络信息
            print(f"网络 I/O: {net_io}")
            print("网络接口地址:")
            for interface, addrs in net_if_addrs.items():
                print(f"  {interface}: {[addr.address for addr in addrs if addr.family == psutil.AF_LINK]}")

            print(f"当前进程数量: {process_count}")

            # 监控指定端口状态
            print("\n=== 端口监控 ===")
            for port in monitor_ports:
                status = "运行中" if is_port_in_use(port) else "未运行"
                print(f"端口 {port}: {status}")

        except Exception as e:
            print(f"发生错误: {e}")

        # 每五秒钟获取一次
        time.sleep(5)

# 调用函数
get_system_info()
{
  "monitor_ports": [80, 443, 8080]
}

案例二: 假设 多台电脑  在局域网中 只有一台电脑可以连接外网, 内网的数据必须要传递到外网电脑

1. 主程序(服务器)

  • 监听连接:在本地的5000端口上创建一个TCP服务器,等待客户端的连接请求。

  • 接受客户端连接:当接收到来自客户端的连接时,打印出连接的客户端地址,并关闭连接。

2. 从程序(客户端)

  • 网络扫描:在指定的子网(如192.168.1.0/24)中,逐个IP地址尝试连接主程序的5000端口。

  • 连接检测:如果成功连接到主程序,打印出主程序的IP地址;如果没有找到主程序,则输出相应的信息。

内网:

import socket
import ipaddress


def find_master():
    # 假设在 192.168.1.0/24 网段
    subnet = "192.168.1.0/24"
    port = 5000

    for ip in ipaddress.IPv4Network(subnet):
        print(f"正在寻找:{ip}")
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.settimeout(0.5)  # 设置超时时间,避免长时间等待
            try:
                s.connect((str(ip), port))
                print(f"找到主程序,地址:{ip}")
                return str(ip)  # 返回主程序的 IP
            except (socket.timeout, ConnectionRefusedError):
                pass  # 尝试下一个 IP

    print("未找到主程序")
    return None
find_master()

外网:

import socket


def start_master():
    # 主程序监听的端口
    host = '0.0.0.0'  # 接收来自任何地址的连接
    port = 5000
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"主程序在端口 {port} 上等待从程序连接...")

        while True:
            conn, addr = s.accept()
            print(f"接收到从程序连接,地址:{addr}")
            conn.close()


start_master()

程序打包

安装pyinstaller

pip install pyinstaller

打开终端  到你程序所在的目录

执行

pyinstaller --onefile main_script.py

就可以看见执行文件


http://www.kler.cn/a/370572.html

相关文章:

  • Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来
  • 华为数据中心CE系列交换机级联M-LAG配置示例
  • Spring Web MVC综合案例
  • usb通过hdc连接鸿蒙next的常用指令
  • Kubernetes(k8s)和Docker Compose本质区别
  • 从玩具到工业控制--51单片机的跨界传奇【3】
  • 1.机器人抓取与操作介绍-深蓝学院
  • softmax回归简洁实现
  • Flutter Row组件实战案例
  • 软考:CORBA架构
  • 高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析
  • 【C++刷题】力扣-#448-找到所有数组中消失的数字
  • 关于整理EACO地球链500个问答0.1的建议,请用数字1-500列出来,谢谢20241028。
  • 使用Django框架开发企业级Web应用
  • NUUO网络视频录像机upload.php任意文件上传漏洞复现
  • 边缘计算网关在储能领域的应用-天拓四方
  • 【对比学习】正交阵/酉矩阵,对称矩阵/Hermite矩阵,正交相似对角化/奇异值分解的内在联系
  • 部署DNS主从服务器
  • go.mod 与go.sum作用
  • CSS进阶
  • HarmonyOS 组件样式@Style 、 @Extend、自定义扩展(AttributeModifier、AttributeUpdater)
  • 再识用户中心
  • Log4Net配置详解及输出自定义消息类示例代码
  • VSCode 中拼写检查排除某些单词
  • DiskMirror TCP服务器与客户端的使用
  • poi处理excel文档时,与lombok的@Accessors(chain = true)注解冲突