跨平台使用Python列出Linux、Windows和Mac上的磁盘驱动器的方法是什么?

12

我正在使用Python2.6。我想要列出系统可能拥有的磁盘驱动器。

在Windows上,它可能是像C:/D:/E:/等。在Linux上,它可能是像/boot/media/SDCard等。而我不知道Mac上的情况。也许在/Volumes下有类似的东西。

是否有人知道Python中一种跨平台的方法(即可以在Linux、Windows和Mac上运行)?

谢谢!


你希望通过这个达到什么样的最终结果? - Pekka
我正在为用户构建一个界面,使他们可以选择连接到计算机的磁盘驱动器。它需要了解驱动器上可用的空间,并具有使用FAT32文件系统(也许)格式化它们以及能够访问文件的能力。 - Thomas O
建议:将选择框架先与您可以访问的内容进行协作,使其正常工作,然后再进行相对简单的设备选择。在格式化方面要小心,以防不必要的错误。 - msw
在Linux方面,/etc/fstab和mount命令的输出是显而易见的答案。 - Andrew
4个回答

18

psutil包(https://pypi.python.org/pypi/psutil)具有disk_partitions函数。

Windows:

>>> import psutil
>>> psutil.disk_partitions()
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='E:\\', mountpoint='E:\\', fstype='', opts='cdrom'), sdiskpart(device='F:\\', mountpoint='F:\\', fstype='NTFS', opts='rw,fixed')]

Linux:

>>> import psutil
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,errors=remount-ro'), sdiskpart(device='/dev/sr0', mountpoint='/media/VBOXADDITIONS_4.3.10_93012', fstype='iso9660', opts='ro,nosuid,nodev,uid=1000,gid=1000,iocharset=utf8,mode=0400,dmode=0500,uhelper=udisks')]

在OS X上,我的驱动器有一个在Finder中显示的名称(Macintosh HD……我很确定这是默认名称)。 有什么办法可以找到该名称,因为这就是所显示的内容…… sdiskpart(device ='/ dev / disk0s2',mountpoint ='/',fstype ='hfs',opts ='rw,local,rootfs,dovolfs,journaled,multilabel') - ArtOfWarfare
我不太了解OS X,但我猜那应该是磁盘的标签。也许可以调用disklabel来查看? - Eric Smith

3
Linux设备没有统一的命名方案,可以保证格式化块设备。虽然有一些约定俗成的规则,但它们可能会有很大的差异,如果我想把我的U盘叫做/Thomas/O,那么在Python中就没有跨平台的方法可以知道:
  1. /Thomas/O 对应 /dev/sdf1
  2. /dev/sdf1 可以创建 FAT32 文件系统
  3. /dev/sdf 不优于 /dev/sdf1
我相信,在Windows系统上也没有跨平台的Python模块可以让你确定H:/是可格式化的,而Z:/不是。每个系统都需要进行特定的检查和验证,你最好通过研究开源磁盘操作软件来学习相关知识。

我在想像gparted这样的程序是如何做到的。但是,那不是跨平台的,只能在Unix(或甚至Linux)上使用,对吧?驱动器不一定要可格式化。只需它们附加或作为内部媒体即可。由于我主要处理SD卡,在Linux下列出/media,在Mac下列出/Volumes,并在Windows上列出所有磁盘驱动器(C:/、D:/等)。 - Thomas O
不要犹豫,直接拿走。我指的是想法,但源代码也一样,除非你喜欢重复造轮子。http://sourceforge.net/projects/gparted/files/gparted/ - msw
并且在Linux上,/media甚至可能不存在,或者未格式化的驱动器也不一定会被挂载以供您查看。即使在NT/Vista/7上,也允许以Unixy方式将设备挂载到任意目录。 - msw

2

Eric Smith's answer to use psutil 对于我在Windows上的使用效果很好,但在OS X上,我更喜欢这个:

from os import listdir
listdir('/Volumes')

它会返回易于理解的名称,至少在我的情况下,这是更可取的(例如,它会返回 Macintosh HD 而不是 //dev/disk0s2)。

从psutil返回的命名元组中获取'mountpoint'属性以获取可读的名称。 - Debjit
@Debjit - 不是的,在OS X上它返回/而不是Macintosh HD - ArtOfWarfare

2

在psutil中,我没有找到一种方法能够包括Windows上的网络挂载。例如,\foobar\home被映射到X:,但是X:在psutil.disk_partitions()返回的列表中不显示(本地驱动器显示)。

更新:要在返回的列表中包括网络驱动器,只需使用:

psutil.disk_partitions(all=True)

效果非常好。

Original Answer翻译成"最初的回答"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接