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

Posted

技术标签:

【中文标题】使用 Python 在 Linux、Windows 和 Mac 上列出磁盘驱动器的跨平台方法?【英文标题】:Cross platform way to list disk drives on Linux, Windows and Mac using Python? 【发布时间】:2011-04-05 12:28:01 【问题描述】:

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

在 Windows 上,可能是 C:/D:/E:/ 等。在 Linux 上,可能是 /boot/media/SDCard 等。我不知道是什么就像在 Mac 上一样。可能在 /Volumes 下。

有谁知道 Python 中的跨平台方式(即适用于 Linux、Windows 和 Mac 的方式)?

谢谢!

【问题讨论】:

你想用这个实现的最终结果是什么? 我正在构建一个界面,供用户选择连接到计算机的磁盘驱动器。它需要知道驱动器上的可用空间,并且能够使用 FAT32 文件系统(也许)格式化它们并能够访问文件。 建议:将选择存根以使用您可以访问的内容,使其工作,然后进行相对简单的设备选择。并且在格式化时要小心,以防不言而喻。 /etc/fstab 和 mount 的输出是 Linux 端的明显答案。 【参考方案1】:

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

窗户:

>>> 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'). 我不太了解 OS X,但我怀疑这将是磁盘的标签。或许可以打电话给disklabel?【参考方案2】:

对于 Linux 设备并没有真正统一的命名方案来保证您是可格式化的块设备。有一些约定,但它们可以有很大的不同,如果我愿意,我可以调用我的拇指驱动器 /Thomas/O,而且 Python 中没有跨平台的方法可以知道:

    /Thomas/O 对应于 /dev/sdf1 /dev/sdf1 可以在其上创建 FAT32 文件系统 /dev/sdf优于 /dev/sdf1

我很确定,也没有跨平台 Python 模块可以让您确定 H:/ 在 Windows 系统上是可格式化的,但 Z:/ 不是。

每个系统都需要自己的特定检查和验证,您最好从研究开源磁盘操作软件中学习。

【讨论】:

我在想像 gparted 这样的程序是如何做到的。但是,那不是跨平台,只有 Unix(甚至是 Linux),对吧?驱动器不一定必须是可格式化的。只是,它们应该附加或内部媒体。由于我主要处理 SD 卡,我只是在 Linux 下列出 /media,在 Mac 上列出 /Volumes,在 Windows 上列出所有磁盘驱动器(C:/、D:/ 等)。 别想了,偷了。想法,我的意思是,但来源也是,除非你喜欢重新发明***。 sourceforge.net/projects/gparted/files/gparted 并且根本无法保证 /media 甚至会存在于 Linux 上,或者会安装未格式化的驱动器供您查看。甚至 NT/Vista/7 也允许以 Unixy 方式将设备挂载到任意目录。【参考方案3】:

Eric Smith's answer to use psutil 在 Windows 上很适合我,但在 OS X 上,我更喜欢这个:

from os import listdir
listdir('/Volumes')

它会返回人类可读的名称,至少在我的情况下,它会更可取(IE,它给你 Macintosh HD 而不是 //dev/disk0s2。)

【讨论】:

从 psutil 返回的命名元组中获取 'mountpoint' 属性以获取人类可读的名称 @Debjit - 不。在返回 / 而不是 Macintosh HD 的 OS X 上【参考方案4】:

我在 psutil 中看不到在 Windows 上包含网络挂载的方法。即 \foobar\home 映射到 X:,但 X: 没有出现在 psutil.disk_partitions() 返回的列表中(本地驱动器是)。

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

psutil.disk_partitions(all=True)

效果很好。

【讨论】:

以上是关于使用 Python 在 Linux、Windows 和 Mac 上列出磁盘驱动器的跨平台方法?的主要内容,如果未能解决你的问题,请参考以下文章

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

来自 Linux 的 Python pysftp get_r 在 Linux 上运行良好,但在 Windows 上运行良好

来自 Linux 的 Python pysftp get_r 在 Linux 上运行良好,但在 Windows 上运行良好

Python实现Windows和Linux之间互相传输文件(文件夹)的方法

Shebang Notation:Windows 和 Linux 上的 Python 脚本?

在 Linux 上使用无头 Chrome 访问被拒绝页面,而有头 Chrome 通过 Python 使用 Selenium 在 Windows 上工作