Надежный и «максимально переносимый» способ сопоставления имени устройства с точкой монтирования в Python - PullRequest
3 голосов
/ 09 января 2012

Я хочу иметь возможность взять имя устройства (например, /dev/disk2) и определить, где (если где-либо) оно установлено (например, /mnt/cdrom или /Volumes/RANDLABEL) в Python.

Один из способов сделать это - запустить df или mount и затем проанализировать вывод, но это выглядит довольно глупо и ненадежно. Например, mount использует " on " в качестве разделителя между устройством и точкой монтирования. Хотя очень маловероятно, что любой из них потенциально может включать эту самую строку, что делает вывод неоднозначным.

В Linux я мог прочитать /proc/mounts, но это не сработает, например, в Mac OS X.

Поэтому я ищу способ найти точку монтирования для устройства надежным способом (т. Е. Может иметь дело с произвольными (легальными) именами устройств / точек монтирования) и «максимально переносимым». (Я предполагаю, что переносимость на Windows может быть невозможна - я не уверен, что в ней даже есть аналогичная концепция точек монтирования устройства.) Мне особенно хочется что-то, что будет работать как в Linux, так и в OS X.

Ответы [ 4 ]

3 голосов
/ 09 января 2012

На самом деле нет портативного способа сделать это, поэтому вам придется иметь дело с кодом, специфичным для платформы.

В OS X самый простой и надежный способ получить информацию о томе диска наУровень команды должен использовать параметр -plist для diskutil list.Вывод может быть обработан непосредственно в Python с помощью модуля plistlib.Например:

diskutil list -plist | \
   python -c 'import sys,plistlib,pprint; pprint.pprint(plistlib.readPlist(sys.stdin))'
{'AllDisks': ['disk0', 'disk0s1', 'disk0s2', 'disk0s3', 'disk1'],
 'AllDisksAndPartitions': [{'Content': 'GUID_partition_scheme',
                            'DeviceIdentifier': 'disk0',
                            'Partitions': [{'Content': 'EFI',
                                            'DeviceIdentifier': 'disk0s1',
                                            'Size': 209715200},
                                           {'Content': 'Apple_CoreStorage',
                                            'DeviceIdentifier': 'disk0s2',
                                            'Size': 499248103424},
                                           {'Content': 'Apple_Boot',
                                            'DeviceIdentifier': 'disk0s3',
                                            'Size': 650002432,
                                            'VolumeName': 'Recovery HD'}],
                            'Size': 500107862016},
                           {'Content': 'Apple_HFSX',
                            'DeviceIdentifier': 'disk1',
                            'MountPoint': '/',
                            'Size': 499097100288,
                            'VolumeName': 'main'}],
 'VolumesFromDisks': ['main'],
 'WholeDisks': ['disk0', 'disk1']}
3 голосов
/ 09 января 2012

Я не думаю, что это работает в 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 голосов
/ 09 января 2012

(Из моего комментария выше: mtab - это стандартный способ Linux. Он не существует во FreeBSD, Mac OS X или Solaris. Первые два имеют системные вызовы getfsstat(2) и getmntinfo(2); в Solaris выможет использовать getmntent(3C). К сожалению, список смонтированных в настоящее время файловых систем не определен POSIX AFAIK, поэтому он сильно отличается на разных платформах.)

В PSI есть экспериментальный модуль mountпакет от PyPI, который, по-видимому, пытается объединить все специфичные для платформы методы в простую абстракцию и который объявлен работающим на Mac OS X (Darwin), AIX, Linux и Solaris.Модуль Дарвина, вероятно, работает на * BSD.

1 голос
/ 09 января 2012

А как насчет чтения /etc/mtab и /etc/fstab?

Я не знаю OSX, но это стандартный способ Unix узнать, что и где монтируется. mtab должен перечислять все смонтированные файловые системы, fstab должен перечислять все предопределенные точки монтирования (которые могут или не могут быть смонтированы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...