Всем привет!
Что я сделал
Я использую библиотеку Bosch BSE C, чтобы получить данные качества воздуха в помещении с подключенного BME680 I2 C, запустив его как подпроцесс in python:
proc = subprocess.Popen(['path_to_bsec_bme680'],stdout=subprocess.PIPE, stderr=subprocess.STDOUT,shell=False)
Чтобы не застревать в этом вечно работающем процессе, я установил для свойств файла неблокирующий:
flags = fcntl(proc.stdout, F_GETFL)
fcntl(proc.stdout, F_SETFL, flags | O_NONBLOCK)
Затем я проверяю вывод с регулярными интервалами для обработки того, что подпроцесс мог бы записать в стандартный вывод:
output = proc.stdout.readline().decode()
Это работает надежно, как и предполагалось.
Проблема и мои подозрения
BSE Программа C выполняет некоторую внутреннюю калибровку и сохраняет свой статус в двоичный файл с именем bsec_iaq.state
. Я подозреваю, что то, как я его запускаю, каким-то образом препятствует процессу записи в этот файл. Цикл калибровки довольно длинный (4 дня), и файл обычно записывается примерно каждые 8 часов, поэтому отладка того, что происходит на самом деле, представляет собой небольшую проблему. все тривиально, например, правильные пути к файлам и так далее, я решил просто запустить процесс дважды, один раз из моей программы python и один раз вручную. Я решил, что подпроцесс должен, по крайней мере, иметь возможность читать файл состояния. К моему удивлению, это сработало, файл состояния теперь регулярно обновляется, а калибровка стабильна. Это явно не лучшая идея, и через несколько дней я заметил, что датчик время от времени начинал немного подергиваться (резкие скачки разных значений). Я полагаю, это результат одновременного запуска двух экземпляров bse c.
Правильно ли я высказал предположение, что я блокирую подпроцесс от записи в файл состояния? Как я мог поймать вывод и по-прежнему позволить ему записывать свое состояние? Я go совершенно не прав?