使用Python3.x查看Linux中的分区

2 投票
2 回答
3556 浏览
提问于 2025-04-17 10:17

最近我刚开始使用Python 3,发现和Python 2.6相比,变化挺大的。我想知道有没有办法通过fdisk来格式化Linux系统中可用的硬盘视图?在Python 2.6中,它的用法大概是这样的:

def parse_fdisk(fdisk_output):
    result = {}
    for line in fdisk_output.split("\n"):
        if not line.startswith("/"): continue
        parts = line.split()

        inf = {}
        if parts[1] == "*":
            inf['bootable'] = True
            del parts[1]

        else:
            inf['bootable'] = False

        inf['start'] = int(parts[1])
        inf['end'] = int(parts[2])
        inf['blocks'] = int(parts[3].rstrip("+"))
        inf['partition_id'] = int(parts[4], 16)
        inf['partition_id_string'] = " ".join(parts[5:])

        result[parts[0]] = inf
    return result

def main():
    fdisk_output = commands.getoutput("fdisk -l")
    for disk, info in parse_fdisk(fdisk_output).items():
        print disk, " ".join(["%s=%r" % i for i in info.items()])

2 个回答

6

看看这个 psutil 包吧。

psutil 是一个模块,提供了一种接口,可以用 Python 获取所有正在运行的进程和系统使用情况的信息(比如 CPU、磁盘、内存),而且它是可移植的。它实现了很多命令行工具提供的功能,比如:ps、top、df、kill、free、lsof、netstat、ifconfig、nice、ionice、iostat、iotop、uptime、tty。

根据他们的 README

它目前支持 LinuxWindowsOSXFreeBSD,同时支持 32位64位,Python 版本从 2.43.3,而且只用了一套代码。

磁盘示例:

>>> psutil.disk_partitions()
[partition(device='/dev/sda1', mountpoint='/', fstype='ext4'),
 partition(device='/dev/sda2', mountpoint='/home', fstype='ext4')]
>>>
>>> psutil.disk_usage('/')
usage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
>>>
>>> psutil.disk_io_counters()
iostat(read_count=719566, write_count=1082197, read_bytes=18626220032, 
       write_bytes=24081764352, read_time=5023392, write_time=63199568)

根据我所知,分区的详细信息(例如可引导标志)目前还不支持。

3

在Python3中,commands这个模块已经被移除了。你可以用subprocess模块来代替它:

import subprocess
import shlex
import sys

def parse_fdisk(fdisk_output):
    result = {}
    for line in fdisk_output.split("\n"):
        if not line.startswith("/"): continue
        parts = line.split()

        inf = {}
        if parts[1] == "*":
            inf['bootable'] = True
            del parts[1]

        else:
            inf['bootable'] = False

        inf['start'] = int(parts[1])
        inf['end'] = int(parts[2])
        inf['blocks'] = int(parts[3].rstrip("+"))
        inf['partition_id'] = int(parts[4], 16)
        inf['partition_id_string'] = " ".join(parts[5:])

        result[parts[0]] = inf
    return result

def main():
    proc = subprocess.Popen(shlex.split("fdisk -l"),
                            stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    fdisk_output, fdisk_error = proc.communicate()
    fdisk_output = fdisk_output.decode(sys.stdout.encoding)
    for disk, info in parse_fdisk(fdisk_output).items():
        print(disk, " ".join(["%s=%r" % i for i in info.items()]))

main()

对于parse_fdisk这个函数,没有做任何改动。唯一需要改的就是在main()里面调用commands.getoutput的地方。

撰写回答