Как прослушать & # 39; вставленное USB-устройство & # 39; события в Linux, в Python?

Нет, нет. Вы не можете перегружать методы на основе типа возврата.

Разрешение перегрузки учитывает подпись функции. Функциональная подпись состоит из:

  • имя функции
  • cv-qualifiers
  • типы параметров

И вот цитата:

1.3.11 signature

информация о функции, которая участвует в разрешении перегрузки (13.3): ее список параметров-параметров (8.3.5 ) и, если функция является членом класса, cv-квалификаторы (если есть) для самой функции и класса, в котором объявлена ​​функция-член. [...]

Опции:

1) изменить имя метода:

class My {
public:
    int getInt(int);
    char getChar(int);
};

2) параметр out:

class My {
public:
    void get(int, int&);
    void get(int, char&);
}

3) шаблоны ... overkill в этом случае.

35
задан joeforker 22 January 2009 в 14:09
поделиться

3 ответа

Обновление : Как сказано в комментариях, Hal не поддерживается в недавних дистрибутивах, стандарт теперь является udev, Вот небольшой пример, который использует бойкий цикл и udev, я сохраняю версию Hal по историческим причинам.

Это в основном , пример в pyudev документации , адаптированный для работы с более старыми версиями, и с бойким циклом, замечает, что фильтр должен быть настроен для определенной необходимости:

import glib

from pyudev import Context, Monitor

try:
    from pyudev.glib import MonitorObserver

    def device_event(observer, device):
        print 'event {0} on device {1}'.format(device.action, device)
except:
    from pyudev.glib import GUDevMonitorObserver as MonitorObserver

    def device_event(observer, action, device):
        print 'event {0} on device {1}'.format(action, device)

context = Context()
monitor = Monitor.from_netlink(context)

monitor.filter_by(subsystem='usb')
observer = MonitorObserver(monitor)

observer.connect('device-event', device_event)
monitor.start()

glib.MainLoop().run()

Старая версия с Hal и d-шиной:

можно использовать привязку D-шины и слушать DeviceAdded и DeviceRemoved сигналы. Необходимо будет проверить возможности Добавленного устройства для выбора устройств хранения только.

Вот небольшой пример, можно удалить комментарии и попробовать его.

import dbus
import gobject

class DeviceAddedListener:
    def __init__(self):

необходимо соединиться с Hal Manager, использующим Системную шину.

        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")

И необходимо соединить слушателя сигналов, Вам интересно на, в этом случае DeviceAdded.

        self.hal_manager.connect_to_signal("DeviceAdded", self._filter)

я использую фильтр на основе возможностей. Это примет любой volume и будет звонить do_something с тем, если, можно прочитать документацию Hal для нахождения более подходящих запросов для потребностей или большей информации о свойствах устройств Hal.

    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

        print "New storage device detectec:"
        print "  device_file: %s" % device_file
        print "  label: %s" % label
        print "  fstype: %s" % fstype
        if mounted:
            print "  mount_point: %s" % mount_point
        else:
            print "  not mounted"
        print "  size: %s (%.2fGB)" % (size, float(size) / 1024**3)

if __name__ == '__main__':
    from dbus.mainloop.glib import DBusGMainLoop
    DBusGMainLoop(set_as_default=True)
    loop = gobject.MainLoop()
    DeviceAddedListener()
    loop.run()
53
ответ дан Jaime Soriano 22 January 2009 в 14:09
поделиться
  • 1
    За исключением того, что проблемы с UTF-16 также верны для UTF-32 и абсолютно каждого существующего кодирования unicode, с тех пор it' s уже верный для базовой системы (т.е. 1 кодовая точка! = 1 символ). Энный символ char32_t выстраивает isn' t обязательно в положении N. – Voo 12 August 2011 в 14:18

Я думаю, что D-шина работала бы упомянутым Chris, но если Вы используете KDE4, Вы могли бы использовать Твердую платформу способом, подобным KDE4 "Новое Устройство Notifier" апплет.

источник C++ для того апплета здесь , который показывает, как использовать Тело для обнаружения новых устройств. Используйте PyKDE4 для привязки Python к этим библиотекам, как показано здесь .

4
ответ дан Matt J 22 January 2009 в 14:09
поделиться
  • 1
    @Chouser: видео разговора больше не доступно в blip.tv. Это может быть найдено здесь . Возможно, you' d нравится обновлять Ваш ответ. – nansen 30 April 2013 в 12:33

Я не попытался писать такую программу сам, однако я только что посмотрел на переходящий по двум ссылкам (Google спасибо!), то, которое я думаю, поможет:

, В частности, читайте об эти org.freedesktop.Hal.Manager интерфейс и DeviceAdded и DeviceRemoved события.:-)

Hope это помогает!

7
ответ дан Søren Løvborg 22 January 2009 в 14:09
поделиться
  • 1
    @Voo: По крайней мере, энное кодовая точка в положении n, все же. Если Вы хотите копаться в определении символов, Вы don' t обходят полностью оперенный алгоритм Unicode, но по крайней мере с UTF-32 у Вас есть надлежащее, представление фиксированной ширины кодовых точек. – Kerrek SB 12 August 2011 в 15:10
Другие вопросы по тегам:

Похожие вопросы: