2

挿入されたUSBドライブを検出するためにdbusを使用し、検出されたときにマウントされているディレクトリを出力するPythonで書かれたプログラムがあります。コードは次のとおりです。

 
インポート dbus
gobject のインポート
輸入シャティル
OS のインポート
サブプロセスのインポート
輸入時間

クラス DeviceAddedListener:
    def __init__(自己):
    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 (自己、udi):
        device_obj = self.bus.get_object ("org.freedesktop.Hal", udi)
        デバイス = dbus.Interface(device_obj, "org.freedesktop.Hal.Device")

        device.QueryCapability("ボリューム") の場合:
            self.do_something(デバイス) を返す

    def do_something (自己、ボリューム):
        device_file = volume.GetProperty("block.device")
        ラベル = ボリューム.GetProperty("ボリューム.ラベル")
        fstype = volume.GetProperty("ボリューム.fstype")
        マウント = volume.GetProperty("volume.is_mounted")
        マウントポイント = ボリューム.GetProperty("ボリューム.マウントポイント")
        試す:
            サイズ = ボリューム.GetProperty("ボリューム.サイズ")
        を除外する:
            サイズ = 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()
    loop.run()

問題は、パス変数 (usb のマウント ポイント) を出力すると、空の文字列が出力されることです。ただし、これらの同じコマンド (Popen() など) を Python インタラクティブ インタープリターで実行すると、パス (/media/03CB-604C) が正常に出力されます。なぜこれが起こるのですか?私のコードへの編集/提案は大歓迎です。前もって感謝します!

4

1 に答える 1

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

これは少しリソースを消費するソリューションですが、希望どおりに動作するはずです。

于 2011-09-09T19:55:12.553 に答える