【问题标题】:Cross platform way to list disk drives on Linux, Windows and Mac using Python?使用 Python 在 Linux、Windows 和 Mac 上列出磁盘驱动器的跨平台方法?
【发布时间】: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 端的明显答案。

标签: python file cross-platform disk


【解决方案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 中没有跨平台的方法可以知道:

  1. /Thomas/O 对应于 /dev/sdf1
  2. /dev/sdf1 可以在其上创建 FAT32 文件系统
  3. /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)

效果很好。

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多