可靠且“尽可能便携”的方式从Python中的设备名称映射到mountpoint

时间:2012-01-09 07:38:30

标签: python linux macos unix

我希望能够获取设备名称(例如:/dev/disk2)并确定它在Python中的安装位置(例如:/mnt/cdrom/Volumes/RANDLABEL)。 / p>

我可以这样做的一种方法是运行dfmount,然后解析输出,但这看起来非常俗气且不可靠。例如,mount使用" on "作为设备和挂载点之间的分隔符。虽然非常不可能,但这些中的任何一个都可能包含该字符串,使得输出不明确。

在Linux上,我可以阅读/proc/mounts,但这不适用于Mac OS X.

所以我正在寻找一种方法,以可靠的方式找到设备的挂载点(即:可以处理任意(合法)设备/挂载点名称)并且“尽可能便携”。 (我猜测可能无法实现对Windows的可移植性 - 我不确定它是否有类似的设备挂载点概念。)我特别想要一些适用于Linux和OS X的东西。

4 个答案:

答案 0 :(得分:3)

实际上没有可移植的方法,所以你需要处理特定于平台的代码。

在OS X上,在命令级别获取磁盘卷信息的最简单且最可靠的方法是使用-plist的{​​{1}}选项。然后可以使用diskutil list模块直接在Python中处理输出。例如:

plistlib

答案 1 :(得分:3)

我不认为这在OS X中有效,但在Linux中以编程方式获取设备是否已安装以及通过dbus org.freedesktop.UDisks.Device接口的路径的一种方式:

import sys, dbus

device_name = sys.argv[1]

bus = dbus.SystemBus()
ud_manager_obj = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.UDisks')

device = bus.get_object('org.freedesktop.UDisks',
                        '/org/freedesktop/UDisks/devices/{0}'.format(device_name))
device_properties = dbus.Interface(device, dbus.PROPERTIES_IFACE)
if device_properties.Get('org.freedesktop.UDisks.Device', 'DeviceIsMounted'):
    for mount_path in device_properties.Get('org.freedesktop.UDisks.Device', 'DeviceMountPaths'):
        print mount_path

答案 2 :(得分:2)

(从我上面的评论:mtab是标准的Linux方式。它在FreeBSD,Mac OS X或Solaris上不存在。前两个有getfsstat(2)getmntinfo(2)系统调用;在Solaris上你可以使用getmntent(3C)。不幸的是,POSIX AFAIK没有定义当前安装的文件系统列表,因此它在不同的平台上有很大的不同。)

来自PyPI的PSI package中有实验mount模块,它似乎试图将所有特定于平台的方法捆绑成一个简单的抽象,并且宣传为在Mac OS X上工作(达尔文),AIX,Linux和Solaris。 Darwin模块可能适用于* BSD。

答案 3 :(得分:1)

阅读/etc/mtab/etc/fstab怎么样?

我不知道OSX,但这是知道安装在哪里的标准Unix方式。 mtab应列出所有已挂载的文件系统,fstab应列出所有预定义的挂载点(可能实际安装或未安装)。