Python操作系统编程

第1关:python获取电脑硬件信息及状态

任务描述

本关任务:编写查看 CPU、内存和存储的要求内容的小程序。

相关知识

为了完成本关任务,你需要掌握:

  1. 获取CPU基本信息
  2. 获取内存基本信息
  3. 获取存储基本信息
掌握利用 python 的 wmi 模块获取电脑硬件信息及状态

WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源。在联网情况下,在命令提示符下输入pip install wmi,完成 wmi 模块的安装。

获取CPU基本信息

使用python中的wmi模块获取处理器ID,名称,速度以及利用率等信息。 在IDLE中输入:

import wmi
import time


def cpu_use(n):
    # ns取一次CPU的使用率
    c = wmi.WMI()
    while True:
        for cpu in c.Win32_Processor():
            timestamp = time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime())
            print('%s | Utilization: %s: %d %%' % (timestamp, cpu.DeviceID, cpu.LoadPercentage))
            time.sleep(n)


# 遍历进程
c = wmi.WMI()
# CPU类型和内存
n = eval(input())
for processor in c.Win32_Processor():
    print("Processor ID: %s" % processor.DeviceID)  # CPU的编号
    print("Process Name: %s" % processor.Name.strip())  # CPU的名称
    print("Process number Of Cores: %s" % processor.numberOfCores)  # CPU的内核数
    print("Process Speed: %s Mbps" % processor.maxClockSpeed)  # CPU的速度
    cpu_use(n)  # 每隔n秒采样一次CPU的速度

运行结果如下图所示。

,

获取内存基本信息

使用python中的wmi模块获取内存容量、空闲率等信息。 在IDLE中输入:

import wmi
import time

c = wmi.WMI()
for Memory in c.Win32_PhysicalMemory():
    x = int(Memory.Capacity) / 1048576
    print("Memory Capacity: %.fMB" % (x))  # 计算内存容量
for Memory in c.Win32_ComputerSystem():
    x = int(Memory.TotalPhysicalMemory) / (2 ** 20)
    print("Memory Capacity in System: %.0fMB" % (x))  # 计算系统内存容量
for Memory in c.Win32_OperatingSystem():
    x = int(Memory.FreePhysicalMemory) / (2 ** 10)
    print("Memory Idle Capacity: %.0fMB" % (x))  # 计算操作系统内存空闲容量
for Memory in c.Win32_PageFileUsage():
    x = int(Memory.AllocatedBaseSize)
    y = int(Memory.CurrentUsage)
    print("PageFile in Memory Capacity: %dMB" % (x))  # 可用内存容量
    print("used PageFile in Memory Capacity: %dMB" % (y))  # 已用内存容量
    print("Free PageFile in Memory Capacity: %dMB" % (x - y))  # 空闲内存容量

运行程序,获取当前计算机内存使用情况,如下图所示。

,

获取存储基本信息

使用python中的wmi模块获取计算机存储系统,特别是辅存的基本信息。 Python查看计算机系统中cache,内存和辅存的容量,查看存储分级特点。 在IDLE中输入:

import wmi
import time

c = wmi.WMI()
sum = 0
for cpu_m in c.Win32_Processor():
    y = int(cpu_m.L2CacheSize)
    z = int(cpu_m.L3CacheSize)
    print("L2 Cache in CPU : %.fKB" % (y))  # 2级Cache容量
    print("L3 Cache in CPU : %.fKB" % (z))  # 3级Cache容量
for Memory in c.Win32_ComputerSystem():
    x = int(Memory.TotalPhysicalMemory) / (2 ** 20)
    print("Memory Capacity in System: %.0fMB" % (x))  # 计算系统内存容量
for disk in c.Win32_LogicalDisk():
    x = int(disk.Size)
    sum = sum + x
print("Hard disk capacity %.0f GB" % (sum / 2 ** 30))  # 计算硬盘容量

运行程序,获取当前计算机存储系统情况,如下图所示。

,

Python查看计算机系统磁盘的容量,名称等物理信息,查看使用情况。 在IDLE中输入:

import os, sys
import time
import wmi


def get_disk_info():
    tmplist = []
    c = wmi.WMI()
    for physical_disk in c.Win32_DiskDrive():
        tmpdict = {}
        tmpdict["物理名称"] = physical_disk.Caption  # 磁盘的物理名称
        tmpdict["容量"] = int(int(physical_disk.Size) / 2 ** 30)  # 磁盘物理容量
        tmplist.append(tmpdict)
    return tmplist


def get_fs_info():
    tmplist = []
    c = wmi.WMI()
    for physical_disk in c.Win32_DiskDrive():
        for partition in physical_disk.associators("Win32_DiskDriveToDiskPartition"):
            for logical_disk in partition.associators("Win32_LogicalDiskToPartition"):
                tmpdict = {}
                tmpdict["盘符"] = logical_disk.Caption  # 磁盘盘符名称
                tmpdict["总容量"] = int(logical_disk.Size) / 2 ** 30
                tmpdict["已用空间"] = (int(logical_disk.Size) - int(logical_disk.FreeSpace)) / 2 ** 30  # 磁盘已用容量
                tmpdict["空闲空间"] = int(logical_disk.FreeSpace) / 1024 / 1024 / 1024
                tmplist.append(tmpdict)
    return tmplist


if __name__ == "__main__":
    disk = get_disk_info()
    print(disk)
    print('--------------------------------------')
    fs = get_fs_info()
    print(fs)

运行程序,获取当前计算机磁盘的基本信息,如下图所示。

,

思考:

1、计算机存储系统有什么特点和规律?

2、如何查询计算机网卡、主板等硬件设备信息?

掌握利用 python 的 psutil 模块获取电脑硬件信息及状态

psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。在联网情况下,在命令提示符下输入pip install psutil,完成psutil模块的安装。

获取CPU基本信息

使用python中的psutil模块获取处理器的名称、个数等信息。 在IDLE中输入:

import psutil

print("--------------cpu---------------")
cpuinfo = psutil.cpu_times();
print('cpu 完整的基本信息:', cpuinfo)
# user () 从系统启动开始累计到当前时刻,用户态的CPU时间,不包含 nice值为负进程。
# nice () 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
# system () 从系统启动开始累计到当前时刻,核心时间
# idle () 从系统启动开始累计到当前时刻,除IO等待时间以外其它等待时间
# iowait () 从系统启动开始累计到当前时刻,IO等待时间
# irq () 从系统启动开始累计到当前时刻,硬中断时间
# softirq () 从系统启动开始累计到当前时刻,软中断时间
print('cpu单项数据信息,用户user的cpu时间比', cpuinfo.user)
print('获取cpu的逻辑个数:', psutil.cpu_count())
print('获取cpu的物理个数:', psutil.cpu_count(logical=False))

运行结果如下图所示。

,

获取内存基本信息

使用python中的psutil模块获取内存容量、空闲量等信息。 在IDLE中输入:

import psutil

print('--------------内存----------------')
mem = psutil.virtual_memory();
print('获取内存完整信息:', mem)
print('获取内存总数:', mem.total / (1024 * 1024 * 1024), 'G')
print('获取内存空闲总数:', mem.free / (1024 * 1024 * 1024), 'G')
print('获取swap分区的内存信息:', psutil.swap_memory())

运行程序,获取当前计算机内存使用情况,如下图所示。

,

获取存储基本信息

使用python中的psutil模块获取计算机辅存的基本信息。 在IDLE中输入:

import psutil

print('-----------磁盘信息----------------')
print('获取磁盘完整信息:', psutil.disk_partitions())
print('获取分区的使用情况:', psutil.disk_usage('/'))
print('获取硬盘总的IO个数、读写信息:', psutil.disk_io_counters())
print('获取单个分区IO个数:', psutil.disk_io_counters(perdisk=True))
import psutil

运行程序,获取当前计算机辅存系统情况,如下图所示。

,

编程要求

根据提示,在右侧编辑器补充代码,获取并输出 CPU、内存和存储的要求内容。

测试说明

平台会对你编写的代码进行测试。

开始你的任务吧,祝你成功!

import psutil

########## Begin ##########
print("--------------cpu---------------")
cpuinfo = psutil.cpu_times()
print('获取cpu的逻辑个数:', psutil.cpu_count())
print('获取cpu的物理个数:', psutil.cpu_count(logical=False))

print('--------------内存----------------')
mem = psutil.virtual_memory()
print('获取内存总数:', mem.total / (1024 * 1024 * 1024), 'G')

print('-----------磁盘信息----------------')
print('获取磁盘完整信息:', psutil.disk_partitions())
########## End ##########

"""
这关没什么好说的,阅读理解,想要本地运行的话需要您自己在pycharm上安装数据库
具体的就不多赘述了
"""

第2关:python查看进程信息

任务描述

本关任务:利用 python 编写查看进程信息的小程序。

相关知识

为了完成本关任务,你需要掌握:

  1. 了解什么是进程信息
  2. 掌握利用 python 查看进程信息
利用 python 查看进程信息

进程是程序的运行过程,是系统进行资源分配和调度的一个独立单位。为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。

进程控制块是用来描述进程的当前状态,本身特性的数据结构,是进程中组成的最关键部分,其中含有描述进程信息和控制信息,是进程的集中特性反映,是操作系统对进程具体进行识别和控制的依据。

PCB一般包括:

  1. 程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整形数字;
  2. 特征信息:一般分系统进程、用户进程、或者内核进程等;
  3. 进程状态:运行、就绪、阻塞,表示进程现的运行情况;
  4. 优先级:表示获得CPU控制权的优先级大小;
  5. 通信信息:进程之间的通信关系的反映,由于操作系统会提供通信信道;
  6. 现场保护区:保护阻塞的进程用;
  7. 资源信息:资源需求、分配控制信息;
  8. 进程实体信息:指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中;
  9. 其他信息:工作单位,工作区,文件信息等。

打开一个“记事本”程序,利用python 获取该进程的id,名称,状态等基本信息。 在IDLE中输入:

import psutil
import datetime

plist = psutil.pids()  # plist为所有进程PID列表
for p in plist:
    ps = psutil.Process(p)  # 根据进程PID查询详细信息
    if ps.name() == "notepad.exe":
        print("-------------进程------------")
        print("进程ID:", p)
        print("进程名称:", ps.name())
        print("进程执行exe绝对路径:", ps.exe())
        print("进程工作目录:", ps.cwd())
        print("进程状态:", ps.status())
        print("进程优先级:", ps.nice())
        print("进程内存利用率:", str(ps.memory_percent()))
        print("进程内存rss、vms信息:", str(ps.memory_info()))
        print("进程开启的线程数:", str(ps.num_threads()))
        dt = datetime.datetime.fromtimestamp(ps.create_time()).strftime("%H:%M:%S")
        print("进程开启时间:", dt)
        break

运行程序,获取当前“notepad”进程的基本情况,如下图所示。

,

思考:

1、如何查询python编译程序的进程信息?

2、一个程序可以开启几个进程,一个进程可以开启几个线程?

编程要求

根据提示,在右侧编辑器补充代码,按要求获取并输出本机上的进程信息。

测试说明

平台会对你编写的代码进行测试:

测试输入:

python

预期输出:

-------------进程------------
进程名称: python
进程执行程序绝对路径: /usr/local/bin/python3.6
进程工作目录: /data/workspace/myshixun
进程状态: running
进程优先级: 0

开始你的任务吧,祝你成功!

import psutil
import datetime

########## Begin ##########
plist = psutil.pids()  # plist为所有进程PID列表
exe = input()
for p in plist:
    ps = psutil.Process(p)  # 根据进程PID查询详细信息
    if ps.name() == exe:
        print("-------------进程------------")
        print("进程名称:", ps.name())
        print("进程执行程序绝对路径:", ps.exe())
        print("进程工作目录:", ps.cwd())
        print("进程状态:", ps.status())
        print("进程优先级:", ps.nice())
        break
########## End ##########

"""
还是阅读理解,同样,想要本地运行的佬需要导入数据库
"""

第3关:python 进行文件和目录操作

任务描述

本关任务:编写使用文件以及目录操作结合文本的小程序。

相关知识

为了完成本关任务,你需要掌握:

  1. 文件读写
  2. 目录文件操作。
利用 python 进行文件和目录操作

在Windows系统中,对文件和目录的操作,通过文件名(绝对地址或相对地址)以及文件或目录的资源句柄来操作。其中句柄实际上是一个数据,是一个Long(长整型)的数据,是Windows用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。

文件操作

在C盘或其他工作盘的根目录下新建一个名为python的txt文档,并其中输入古诗《登鹳雀楼》。 在IDLE中输入:

import os

filename = "E:\python.txt"  # 待操作文件绝对路径

# r:以读方式打开
# w:以写方式打开
# a:以追加模式打开 (从 EOF 开始, 必要时创建新文件)
# r+:以读写模式打开,w+:以读写模式打开 (参见 w )
# a+:以读写模式打开 ,rb:以二进制读模式打开
# wb:以二进制写模式打开 (参见 w )
# ab:以二进制追加模式打开 (参见 a )
# rb+:以二进制读写模式打开 (参见 r+ )
# wb+:以二进制读写模式打开 (参见 w+ )
# ab+:以二进制读写模式打开 (参见 a+ )

f = open(filename, 'w')  # 按写方式打开文件,文件不存在则新建,f为操作句柄
str = "白日依山尽,黄河入海流。\n欲穷千里目,更上一层楼。\n"
f.seek(0, 2)  # 从文件末尾处写,(0,0)为文件开头处,(0,1)为当前位置
line = f.write(str)  # 写入文件
f.close()  # 关闭句柄
f = open(filename, 'r')  # 按读方式打开文件
print(f.read())  # 读取文件输出

运行程序,得到文件操作的读取信息,如下图所示。

,

思考:

1、将上述程序的f = open(filename, 'w')语句的操作模式更改为ra,结果如何?

2、修改上述程序,将文件路径和文件写入内容都由输入input()确定?

目录文件操作

遍历在E盘或其他工作盘的根目录下的所有文件或所有的文件夹及其子文件夹的所有文件。 在IDLE中输入:

import os


def fileInFolder(filepath):
    pathDir = os.listdir(filepath)  # 获取filepath文件夹下的所有的文件
    files = []
    for allDir in pathDir:
        child = os.path.join('%s\\%s' % (filepath, allDir))  # 拼接 filepath, allDir 的文件路径
        files.append(child)
    return files


def getfilelist(filepath):
    filelist = os.listdir(filepath)  # 获取filepath文件夹下的所有的文件
    files = []
    for i in range(len(filelist)):
        child = os.path.join('%s\\%s' % (filepath, filelist[i]))
        if os.path.isdir(child):
            files.extend(getfilelist(child))
        else:
            files.append(child)
    return files


filepath = "E:/test1/"
print("————————遍历文件夹下所有文件————————")
print(fileInFolder(filepath))
print("—————遍历文件夹及其子文件夹的所有文件——————")
print(getfilelist(filepath))

运行程序,得到指定路径目录下,如E:\\test1下的遍历文件信息,如下图所示。

,

思考:上述两种遍历有什么区别?

编程要求

根据提示,在右侧编辑器补充代码,将 src/step3/text/ 文件夹下的所有文件(所有文件名均为:0.txt)内容结合在一起并输出。

文件结构如下:

,

测试说明

平台会对你编写的代码进行测试。

开始你的任务吧,祝你成功!

import os

path = 'src/step3/text'
# 输出字符串
str_text = ""
# 获取 path 下的所有文件夹
os_list = os.listdir(path)
os_list.sort(key = lambda x: int(x)) # 将所有的文件按文件名的数字大小进行排序
# 遍历所有文件夹
for i in os_list:
    # 拼接文件名并读取
    # 可以使用下面的语句实现相同的效果
    '''with open(os.path.join(path, i + '/0.txt'), encoding='utf-8') as f:'''
    f = open(os.path.join(path, i + '/0.txt'), encoding='utf-8') # 打开所有的“0.txt”文件,并以utf-8编码读取
    # 结合所有文件夹中的内容
    str_text += f.read() # 读取文件内容并添加到 str_text 中
    f.close()
print(str_text)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月28日
下一篇 2023年12月28日

相关推荐