在python中打印usb挂载点时出现问题

在python中打印usb挂载点时出现问题,python,usb,subprocess,dbus,Python,Usb,Subprocess,Dbus,我有一个用python编写的程序,它使用dbus检测插入的usb驱动器,并在检测到它们时打印它们装入的目录。代码如下: import dbus import gobject import shutil import os import subprocess import time class DeviceAddedListener: def __init__(self): self.bus = dbus.SystemBus() self.hal_manager_

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

import dbus import gobject import shutil import os import subprocess import time class DeviceAddedListener: def __init__(self): self.bus = dbus.SystemBus() self.hal_manager_obj = self.bus.get_object( "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") 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"): return self.do_something(device) def do_something(self, volume): device_file = volume.GetProperty("block.device") label = volume.GetProperty("volume.label") fstype = volume.GetProperty("volume.fstype") mounted = volume.GetProperty("volume.is_mounted") mount_point = volume.GetProperty("volume.mount_point") try: size = volume.GetProperty("volume.size") except: 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) path = p3.communicate()[0] print path if __name__ == '__main__': from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) loop = gobject.MainLoop() DeviceAddedListener() loop.run() 导入DBU 导入gobject 进口舒蒂尔 导入操作系统 导入子流程 导入时间 类别DeviceAddedListener: 定义初始化(自): self.bus=dbus.SystemBus() self.hal\u manager\u obj=self.bus.get\u对象( “org.freedesktop.Hal”, “/org/freedesktop/Hal/Manager”) self.hal\u manager=dbus.Interface(self.hal\u manager\u obj, “org.freedesktop.Hal.Manager”) self.hal\u管理器。将\u连接到\u信号(“设备添加”,self.\u过滤器) def_过滤器(自身、udi): device_obj=self.bus.get_对象(“org.freedesktop.Hal”,udi) device=dbus.Interface(device_obj,“org.freedesktop.Hal.device”) 如果device.QueryCapability(“卷”): 返回自我。做某事(设备) def do_某事(自身、体积): device\u file=volume.GetProperty(“block.device”) label=volume.GetProperty(“volume.label”) fstype=volume.GetProperty(“volume.fstype”) mounted=volume.GetProperty(“卷已装入”) mount\u point=volume.GetProperty(“volume.mount\u point”) 尝试: 大小=volume.GetProperty(“volume.size”) 除: 大小=0 p1=subprocess.Popen([“df”,“-h”],stdout=subprocess.PIPE) p2=subprocess.Popen([“grep”,设备_文件),stdin=p1.stdout,stdout=subprocess.PIPE) p3=subprocess.Popen([“awk”,“{print$6}”],stdin=p2.stdout,stdout=subprocess.PIPE) path=p3.communicate()[0] 打印路径 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 从dbus.mainloop.glib导入DBusGMainLoop DBusGMainLoop(将_设置为_default=True) loop=gobject.MainLoop() DeviceAddedListener() loop.run()
问题是,当我打印path变量(usb的挂载点)时,它会打印一个空字符串。但是,当我在python交互式解释器中执行这些相同的命令(Popen()等)时,它会很好地打印路径(/media/03CB-604C)。为什么会发生这种情况?对我的代码的任何编辑/建议都将不胜感激。提前谢谢

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

在安装过程完成之前,将插入设备并执行代码

尝试将Popen调用放在while循环中(见下文)

path=“”
计数=0
当计数<10且路径==“”时:
p1=subprocess.Popen([“df”,“-h”],stdout=subprocess.PIPE)
p2=subprocess.Popen([“grep”,设备_文件),stdin=p1.stdout,stdout=subprocess.PIPE)
p3=subprocess.Popen([“awk”,“{print$6}”],stdin=p2.stdout,stdout=subprocess.PIPE)
path=p3.communicate()[0]
计数+=1
如果路径==“”:
时间。睡眠(1)
打印路径

这是一个需要大量资源的解决方案,但它应该满足您的需要。

是否“p1…p2…行缩进错误?它们是“do_something”的一部分?请允许我提出一个建议——如果通过inotify(内核扩展)实现,那么通过dbus实现的效率要低得多。如果您可以选择在(或者它已经内置了),您可以只查看挂载目录。此外,不需要子处理df/grep/awk——您需要的是/proc/diskstats,可以用几行本机python进行提取。@mjhm,是的,很抱歉缩进不好:在我的实际代码中,它们是do_something的一部分,但当我将其转移到堆栈溢出时,缩进变得混乱d up.@synthezerpatel,我不知道这个内核扩展名。我会尝试一下,看看会发生什么!@synthezerpatel,好吧,我还没有尝试inotify,但我确实查看了/proc/diskstats。在这个文件中,你能确切地告诉我如何解释这些信息并找出usb安装的目录吗(请记住,我正在尝试操作usb上的文件)?我要做的是获取此目录:/media/03CB-604,以便我可以将文件从usb复制到我的机器上。Thx!
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