挿入された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) が正常に出力されます。なぜこれが起こるのですか?私のコードへの編集/提案は大歓迎です。前もって感謝します!