如何获得连接到系统的USB驱动器的目录?

时间:2014-03-24 16:57:15

标签: python path directory usb

对于我正在制作的简单的USB大容量存储设备浏览器,我需要获取为usb驱动器创建的目录的路径(我认为它类似于/ media / user / xxxxx)。任何人都可以建议最好/最简单的方法吗?我正在使用Ubuntu 13.10机器,并将在Linux设备上使用它。

在python中需要这个。

5 个答案:

答案 0 :(得分:12)

这应该让你开始:

#!/usr/bin/env python

import os
from glob import glob
from subprocess import check_output, CalledProcessError

def get_usb_devices():
    sdb_devices = map(os.path.realpath, glob('/sys/block/sd*'))
    usb_devices = (dev for dev in sdb_devices
        if 'usb' in dev.split('/')[5])
    return dict((os.path.basename(dev), dev) for dev in usb_devices)

def get_mount_points(devices=None):
    devices = devices or get_usb_devices() # if devices are None: get_usb_devices
    output = check_output(['mount']).splitlines()
    is_usb = lambda path: any(dev in path for dev in devices)
    usb_info = (line for line in output if is_usb(line.split()[0]))
    return [(info.split()[0], info.split()[2]) for info in usb_info]

if __name__ == '__main__':
    print get_mount_points()

它是如何运作的?

首先,我们为/sys/block文件解析sd*(由https://stackoverflow.com/a/3881817/1388392提供)以过滤掉usb设备。 稍后您调用mount并仅为这些设备解析输出行。

当然,它们可能是一些边缘情况,当这不起作用,可移植性问题等。或者更好的方法来做到这一点。但是对于更多信息,您应该寻求有关SuperUser或ServerFault的帮助,以及更有经验的Linux黑客。

答案 1 :(得分:4)

使用m.wasowski代码,可能会发生意外行为:

return [(info.split()[0], info.split()[2]) for info in usb_info]

如果您的USB设备名称中包含空格字符,则此部分代码可能会产生错误。我用名为“USB DEVICE”的设备获得了这种行为。

info.split()[2]

返回媒体/家庭/ USB,当它是媒体/家庭/ USB设备时。

我修改了那个部分,所以它是创建单词“type”,并用这个替换了这一行:

#return [(info.split()[0], info.split()[2]) for info in usb_info]

fullInfo = []
for info in usb_info:
    print(info)
    mountURI = info.split()[0]
    usbURI = info.split()[2]
    print(info.split().__sizeof__())
    for x in range(3, info.split().__sizeof__()):
        if info.split()[x].__eq__("type"):
            for m in range(3, x):
                usbURI += " "+info.split()[m]
            break
    fullInfo.append([mountURI, usbURI])
return fullInfo

答案 2 :(得分:2)

我不得不修改@ m.wasowski的代码,使其在Python3.5.4上运行如下。

def get_mount_points(devices=None):
    devices = devices or get_usb_devices()  # if devices are None: get_usb_devices
    output = check_output(['mount']).splitlines()
    output = [tmp.decode('UTF-8') for tmp in output]

    def is_usb(path):
        return any(dev in path for dev in devices)
    usb_info = (line for line in output if is_usb(line.split()[0]))
    return [(info.split()[0], info.split()[2]) for info in usb_info]

答案 3 :(得分:0)

我不得不进一步修改@ nick-sikrier和@ m-wasowski响应以处理LUK加密设备。

def get_usb_devices():
    sdb_devices = map(os.path.realpath, glob('/sys/block/sd*'))
    usb_devices = (dev for dev in sdb_devices
                   if any(['usb' in dev.split('/')[5],
                           'usb' in dev.split('/')[6]]))
    return dict((os.path.basename(dev), dev) for dev in usb_devices)

def get_mount_points(
    devices = get_usb_devices()
    fullInfo = []
    for dev in devices:
        output = subprocess.check_output(['lsblk', '-lnpo', 'NAME,MOUNTPOINT', '/dev/' + dev]).splitlines()
    for mnt_point in output:
        mnt_point_split = mnt_point.split(' ', 1)
        if len(mnt_point_split) > 1 and mnt_point_split[1].strip():
            fullInfo.append([mnt_point_split[0], mnt_point_split[1]])
    return fullInfo

答案 4 :(得分:0)

在python中执行一个简单的shell管道:

import subprocess
driver_name = "my_usb_stick"

path = subprocess.check_output("cat /proc/mounts | grep '"+driver_name+"' | awk '{print $2}'", shell=True)

path = path.decode('utf-8') # convert bytes in string
>>> "/media/user/my_usb_stick"

说明

  • /proc/mounts/ :是列出所有已安装设备的文件
<块引用>
  • 第一列指定安装的设备。
  • 第二列显示挂载点。
  • 第三列说明文件系统类型。
  • 第 4 列告诉您它是以只读 (ro) 或读写 (rw) 方式挂载的。
  • 第 5 和第 6 列是虚拟值,旨在匹配 /etc/mtab 中使用的格式

更多细节见这个答案:How to interpret /proc/mounts?

  • grep 返回包含您的驱动程序名称的行

  • awk 返回第二列,也就是挂载点,也就是你的路径。