2012-01-09 51 views
3

我希望能夠獲取設備名稱(例如:/dev/disk2)並確定它安裝在哪裏(如果有的話)(例如:/mnt/cdrom/Volumes/RANDLABEL)。可靠且「儘可能便攜」的方式可以在Python中從設備名稱映射到安裝點

我可以這樣做的一種方法是運行dfmount然後解析輸出,但這看起來很俗氣且不可靠。例如,mount使用" on "作爲設備和掛載點之間的分隔符。雖然不太可能,但其中任何一個都可能包含這個字符串,使輸出變得模糊不清。

在Linux上,我可以讀取/proc/mounts,但這不適用於Mac OS X。

所以我正在尋找一種以可靠的方式(例如:可以處理任意(合法)設備/掛載點名稱)找到設備掛載點並且「儘可能便攜」的方式。 (我猜可能無法移植到Windows - 我不確定它是否有類似的設備掛載點概念。)我特別想要一些可以在Linux和OS X上運行的東西。

+1

請記住,相同的設備可以有多個名稱,並且 - 在某些平臺上 - 多個掛載點。 – Zanchey 2012-01-09 08:03:04

+0

@贊吉那很好。我只需要找到給定設備名稱的任何安裝點。 – 2012-01-10 18:09:57

回答

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。達爾文模塊可能適用於* BSD。

1

讀什麼/etc/mtab/etc/fstab

我不知道OSX,但這是標準的Unix方法來知道什麼是掛載在哪裏。 mtab應列出所有安裝的文件系統,fstab應列出所有預定義的安裝點(實際可能或可能未實際安裝)。

+0

嗯,這是標準的Linux方式。在FreeBSD,Mac OS X或Solaris上不存在'mtab'。前兩者具有'getfsstat(2)'和'getmntinfo(2)'系統調用;在Solaris上,您可以使用'getmntent(3C)'。不幸的是,目前安裝的文件系統列表並未由POSIX AFAIK定義,因此它在不同的平臺上有很大的不同。 – Zanchey 2012-01-09 08:29:11

3

真的沒有一種便攜的方式來做到這一點,所以你需要處理平臺特定的代碼。

在OS X上,在命令級別獲取磁盤卷信息的最簡單和最可靠的方法是使用-plist選項diskutil list。然後可以使用plistlib模塊直接在Python中處理輸出。例如:

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

我不認爲這部作品在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 
相關問題