使用Python3.x查看Linux中的分区
最近我刚开始使用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:
它目前支持 Linux、Windows、OSX 和 FreeBSD,同时支持 32位 和 64位,Python 版本从 2.4 到 3.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
的地方。