如何使用Python 3.x获取类Unix系统中路径对应的设备文件及分区号
没问题!在Python 3.x里,完全可以实现获取指定目录对应设备名称和分区编号的需求,我给你分享两种实用的实现方式:
方法一:使用标准库
os模块(无需额外安装) 这个方法依赖Unix类系统的/proc/mounts虚拟文件(实时记录所有挂载信息),结合标准库的os模块就能完成,不需要安装第三方包:
import os def get_device_info(dir_path): # 处理符号链接,获取目录的真实物理路径 real_dir = os.path.realpath(dir_path) # 先检查目录是否有效 if not os.path.isdir(real_dir): raise ValueError(f"指定路径不是有效目录:{dir_path}") # 读取/proc/mounts文件,获取系统所有挂载项 with open('/proc/mounts', 'r') as f: mount_lines = f.readlines() best_device = None longest_mount_point = "" # 遍历挂载项,找到最匹配的设备(优先最长挂载点,避免嵌套挂载干扰) for line in mount_lines: parts = line.strip().split() if len(parts) < 2: continue device, mount_point = parts[0], parts[1] # 判断目标目录是否属于当前挂载点的子目录,且挂载点长度更长 if real_dir.startswith(mount_point) and len(mount_point) > len(longest_mount_point): longest_mount_point = mount_point best_device = device return best_device # 测试示例 print(get_device_info('/')) # 输出示例:/dev/sda1 print(get_device_info('/home')) # 输出示例:/dev/sda2
关键说明:
/proc/mounts是Unix类系统特有的虚拟文件,普通用户即可读取,内容包含设备、挂载点、文件系统类型等信息。os.path.realpath()用来处理符号链接,确保我们拿到的是目录的真实物理路径,避免链接指向的干扰。- 优先匹配最长挂载点,是为了应对嵌套挂载的场景(比如
/home/user有独立挂载时,能准确返回对应设备而非/home的设备)。
方法二:使用第三方库
psutil(更简洁易维护) psutil是一个跨平台的系统监控库,封装了很多底层系统调用,用它来获取设备信息会更简洁,代码可读性也更强:
步骤1:安装psutil
pip install psutil
步骤2:实现代码
import os import psutil def get_device_info(dir_path): real_dir = os.path.realpath(dir_path) if not os.path.isdir(real_dir): raise ValueError(f"指定路径不是有效目录:{dir_path}") # 获取所有物理磁盘挂载信息(all=False过滤掉tmpfs、sysfs这类虚拟文件系统) partitions = psutil.disk_partitions(all=False) best_device = None longest_mount_point = "" for partition in partitions: mount_point = partition.mountpoint if real_dir.startswith(mount_point) and len(mount_point) > len(longest_mount_point): longest_mount_point = mount_point best_device = partition.device return best_device # 测试示例 print(get_device_info('/')) # 输出示例:/dev/sda1 print(get_device_info('/home')) # 输出示例:/dev/sda2
关键说明:
psutil.disk_partitions(all=False)会自动过滤掉虚拟文件系统的挂载点,只返回真实的磁盘分区信息,省去了我们自己筛选的麻烦。- 这个方法在Linux、macOS等Unix类系统上都能正常工作,兼容性更好。
内容的提问来源于stack exchange,提问作者pah8J
相关产品推荐
相关产品推荐

