问题在python中打印usb的挂载点

Posted

技术标签:

【中文标题】问题在python中打印usb的挂载点【英文标题】:problem printing mount point of usb in python 【发布时间】:2011-05-21 09:12:05 【问题描述】:

我有一个用 python 编写的程序,它使用 dbus 来检测插入的 USB 驱动器,并在检测到它们时打印它们安装的目录。代码如下:

导入dbus 导入对象 进口舒蒂尔 导入操作系统 导入子流程 进口时间 类 DeviceAddedListener: def __init__(self): self.bus = dbus.SystemBus() self.hal_manager_obj = self.bus.get_object( "org.freedesktop.Hal", “/org/freedesktop/Hal/经理”) self.hal_manager = dbus.Interface(self.hal_manager_obj, “org.freedesktop.Hal.Manager”) self.hal_manager.connect_to_signal("DeviceAdded", self._filter) def _filter(self, udi): device_obj = self.bus.get_object ("org.freedesktop.Hal", udi) device = dbus.Interface(device_obj, "org.freedesktop.Hal.Device") if device.QueryCapability("volume"): 返回 self.do_something(device) def do_something(自我,音量): device_file = volume.GetProperty("block.device") label = volume.GetProperty("volume.label") fstype = volume.GetProperty("volume.fstype") mount = volume.GetProperty("volume.is_mounted") mount_point = volume.GetProperty("volume.mount_point") 尝试: size = volume.GetProperty("volume.size") 除了: 大小 = 0 p1 = subprocess.Popen(["df", "-h"], stdout=subprocess.PIPE) p2 = subprocess.Popen(["grep", device_file], stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(["awk", " print $6 "], stdin=p2.stdout, stdout=subprocess.PIPE) 路径 = p3.communicate()[0] 打印路径 如果 __name__ == '__main__': 从 dbus.mainloop.glib 导入 DBusGMainLoop DBusGMainLoop(set_as_default=True) 循环 = gobject.MainLoop() DeviceAddedListener() 循环运行()

问题是当我打印路径变量(usb 的挂载点)时,它会打印一个空字符串。但是,当我在 python 交互式解释器中执行这些相同的命令(Popen() 等)时,它会很好地打印路径(/media/03CB-604C)。为什么会出现这种情况?对我的代码的任何编辑/建议将不胜感激。提前致谢!

【问题讨论】:

“p1... p2... 行是否缩进错误?它们是“do_something”的一部分吗? 请允许我提出一个建议——通过 dbus 执行此操作的效率远低于通过 inotify(内核扩展)执行此操作的效率。如果您可以选择构建它(或者它已经内置),您可以只观察挂载目录。 pyinotify.sourceforge.net 另外,不需要对 df/grep/awk 进行子处理——你想要的在 /proc/diskstats 中,可以用几行本机 python 提取。 @mjhm,对缩进很抱歉:在我的实际代码中,它们是 do_something 的一部分,但是当我将它转移到堆栈溢出时,缩进搞砸了。 @synthesizerpatel,我不知道这个内核扩展。我会尝试一下,看看会发生什么! @synthesizerpatel,好吧,我还没有尝试 inotify,但我确实查看了 /proc/diskstats。在那个文件中,你能准确地告诉我如何解释这些信息并找出 USB 安装的目录(记住,我正在尝试操作 USB 上的文件)?我想要做的是获取这个目录:/media/03CB-604,这样我就可以将文件从 USB 复制到我的机器上。谢谢! 【参考方案1】:

在您最初的问题中,您似乎被比赛条件打败了。

在安装过程完成之前插入设备并执行您的代码。

尝试将 Popen 调用置于 while 循环中(见下文)。

path = ""
count = 0
while count < 10 and path == "":
    p1 = subprocess.Popen(["df", "-h"], stdout=subprocess.PIPE)
    p2 = subprocess.Popen(["grep", device_file], stdin=p1.stdout, stdout=subprocess.PIPE)
    p3 = subprocess.Popen(["awk", " print $6 "], stdin=p2.stdout, stdout=subprocess.PIPE)
    path = p3.communicate()[0]
    count += 1
    if path == "":
        time.sleep(1)
print path

这有点耗费资源,但它应该可以满足您的需求。

【讨论】:

以上是关于问题在python中打印usb的挂载点的主要内容,如果未能解决你的问题,请参考以下文章

linux下 如何以读写方式挂载光驱到挂载点

Linux常见设备及相应/dev/xxx文件名Mount Point挂载点Mount命令fstab挂载分区

Python:在 Windows 或 Linux 上获取挂载点

u盘linux不能挂载

centos 挂载NTFS移动硬盘

Linux中/下目录包含的内容