После часов непродуктивного поиска в Google и неудачных пробных решений я обращаюсь к невероятно умным людям, которые отвечают здесь на stackoverflow.
Моя конфигурация:
У меня есть устройство с 24 камерами, состоящее из 24 USB-камер и пары USB-концентраторов, подключенных к моему MacBook Pro, на котором установлена Catalina.
Я написал python программа, которая вызывает оболочки для imagesnap -list, чтобы получить список всех USB-камер, подключенных к моей Ma c.
Я отказываюсь от встроенной камеры FaceTime из полученного списка, и список оставшихся камер - это 24 из моего устройства массива изображений.
Моя python программа затем перебирает все камеры в списке и вызывает вызовы оболочки imagesnap -d, чтобы получить изображение с каждой камеры, а затем сохраняет изображение в формате JPG.
Мое устройство массива камер предназначено для использования несколько раз подряд без прерывания работы программы или перезагрузка Ma c.
Моя проблема:
Эта программа правильно захватывает 24 изображения из 24 камеры большую часть времени.
Но время от времени команда imagesnap -d будет зависать в ожидании ввода-вывода с камеры.
Когда Я говорю, что он зависает, я имею в виду, что он не возвращается и не говорит об ошибке, и при этом он не указывает ошибочно, что изображение было получено, он просто продолжает ждать, пока изображение поступит от устройства вечно, пока я не CNTL- C или установить время ожидания вызова оболочки.
Когда устройство зависает таким образом, оно всегда будет зависать при каждом следующем вызове - до тех пор, пока устройство или шина USB не будут сброшены. (обычно путем перезагрузки компьютера).
Перезагрузка универсально устраняет эту проблему. Но со временем все больше и больше камер будут испытывать эту проблему, пока они снова не будут сброшены.
Решение, на которое я надеюсь:
Я надеюсь, что есть какой-то код python или команда оболочки, которую я могу выполнить для сброса speci c USB-устройства (или в моем случае сбросить спецификацию c USB-устройство камеры) .
(Примечание: я обнаружил, что python может сделать ioctl () и fcntl () обращаются к устройству, но я не смог найти никаких советов о том, как использовать их для сброса USB или указать устройство камеры.)
В качестве альтернативы, возможно, есть способ сбросить спецификации c физический USB-порт , к которому подключен массив, или путь к Сбросьте всю шину USB.
В своем исследовании я натолкнулся на ряд решений, которые не являются программируемыми c, поэтому можно не быть частью моего автоматическое обнаружение и исправление этих замороженных портов. Другие - это какой-то вариант обычной перезагрузки компьютера, сброса SM C или сброса некоторой памяти путем перезагрузки, когда «удерживаются клавиши« Command-Option-PR »вместе». Очевидно, что такие решения не позволяют мне программно вызывать их перезагрузить устройство и продолжить работу с программой, чтобы они мне не нужны.