проблема печати точки монтирования usb в python - PullRequest
2 голосов
/ 07 декабря 2010

У меня есть программа, написанная на 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()

Проблема в том, что когда я печатаю переменную path (точку монтирования usb), она печатает пустую строку. Однако, когда я выполняю те же самые команды (Popen () и т. Д.) В интерактивном интерпретаторе python, он просто печатает путь (/ media / 03CB-604C). Почему это происходит? Любые изменения / предложения в мой код будет принята с благодарностью. Заранее спасибо!

1 Ответ

1 голос
/ 09 сентября 2011

В вашем исходном вопросе кажется вероятным, что вас избивают условия гонки.

Устройство вставлено, и ваш код выполняется до завершения процесса монтирования.помещение вызовов 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

Это немного ресурсоемкое решение, но оно должно делать то, что вы хотите.

...