Привет всем!


Сразу говорю, хочется достаточно странного. Собственно в тегах это и указано.
Пишу на Python небольшую софтинку с использованием OpenCV. Кроме обработки изображений OpenCV используется и для GUI. Это удобно, особенно в процессе отладки, т.к. не возникает необходимости в дополнительных манипуляциях с картинкой перед отображением, а можно просто показать с помощью cv2.imshow().
Да, я знаю, что модуль High-level GUI не предназначен для сложных интерфейсов и об этом прямо говорится в документации.


Проблема в том, что для работы GUI из OpenCV надо периодически дёргать cv2.waitKey(). Обычно это делается в цикле while True:. Но у меня есть другие источники событий, работа с которыми осуществляется через файловые дескрипторы. Т.е. цикл обработки событий через select / poll / epoll. Логичным было бы файловый дескриптор от unix-сокета, соответствующего подключению к X11-серверу добавить в этот цикл обработки событий и cv2.waitKey() вызывать только тогда, когда там есть данные, а не по таймауту или в цикле while True:.


Возникает вопрос. Как узнать номер нужного файлового дескриптора?
Есть посмотреть содержимое /proc/self/fd/, то там явно есть нужный дескриптор:


0 -> /dev/pts/1
1 -> /dev/pts/1
2 -> /dev/pts/1
3 -> anon_inode:[eventfd]
4 -> pipe:[576490]
5 -> pipe:[576490]
6 -> socket:[576491]
7 -> socket:[576492]


Дескрипторы с номером больше 2 открываются после вызова cv2.namedWindow().
Как узнать, какой из них какой?


Как вообще в общем случае узнать какому объекту файловой системы соответствует ссылка вида socket:[number] в /proc/self/fd/?









 , ,






URL записи