Получить путь к устройству от pyudev с помощью python

Использование pydev с python-2.7Хочу получить путь к устройству подключенных устройств.

Теперь я использую этот код:

from pyudev.glib import GUDevMonitorObserver as MonitorObserver

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

но device вернуть строку как это:

(И '/ SYS / устройства /pci0000:00/pci0000:00:01,0/0000,000/ USB1/1-2')

Как я могу получить путь как /dev/ttyUSB1?

2 ответа

Решение

Device(u'/sys/devices/pci0000:00/pci0000:00:01.0/0000.000/usb1/1-2') это устройство USB (т.е. device.device_type == 'usb_device'). Во время его перечисления /dev/tty* Файл еще не существует, так как он позднее назначается дочернему интерфейсу USB во время собственного перечисления. Таким образом, вам нужно дождаться отдельного события добавления устройства для Device(u'/sys/devices/pci0000:00/pci0000:00:01.0/0000.000/usb1/1-2:1.0') который бы имел device.device_type == 'usb_interface',

Тогда вы могли бы просто сделать print [os.path.join('/dev', f) for f in os.listdir(device.sys_path) if f.startswith('tty')] в его device_added():

import os
import glib
import pyudev
import pyudev.glib

context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
observer = pyudev.glib.GUDevMonitorObserver(monitor)

def device_added(observer, device):
    if device.device_type == "usb_interface":
        print device.sys_path, [os.path.join('/dev', f) for f in os.listdir(device.sys_path) if f.startswith('tty')]

observer.connect('device-added', device_added)
monitor.start()

mainloop = glib.MainLoop()
mainloop.run()

Я нахожу это решение:

def device_event (observer, action, device):
    if action == "add":
        last_dev = os.popen('ls -ltr /dev/ttyUSB* | tail -n 1').read()
        print "Last device: " + last_dev

Я знаю... это ужасно.

Другие вопросы по тегам