#python #adafruit-circuitpython
Вопрос:
У меня есть основной файл fileA.py
, который управляет освещением в моей радиостудии на основе триггеров GPIO. Та часть, которая меня беспокоит, находится в цикле True, как показано ниже:
While True: #other triggers for other things unrelated if GPIO.input(25) == GPIO.LOW and (state) = 'off': blue() studiostatus = "online" #other triggers for other things unrelated elif count gt; 7200: dbo() clockoff() studiostatus = "offline"
Затем у меня есть второй файл python fileB.py
, работающий в то же время на том же Raspberry Pi
import SocketServer from BaseHTTPServer import BaseHTTPRequestHandler def some_function(): print "some_function got called" class MyHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == '/doorbell': some_function() self.send_response(200) httpd = SocketServer.TCPServer(("", 8080), MyHandler) httpd.serve_forever()
Однако я бы хотел, чтобы это постоянно обновлялось с studiostatus
изменением от fileA.py
, чтобы строка в fileB.py
стала
if self.path == '/doorbell' and studiostatus = "online": action1() elif self.path == '/doorbell' and studiostatus = "offline": action2()
Любая помощь очень признательна, так как в настоящее время я не вижу дерева для деревьев в том, как лучше всего справиться с этим
Комментарии:
1. Неэлегантным решением является обмен данными через файл. Что-то вроде записи переменных данных в
.txt
файл, а затем считывания их из другого сценария. Еще более неэлегантным решением было бы поместить цикл в функцию, импортироватьfileA
вfileB
нее и запустить функцию, объявив нужные переменные глобальными.2. Я рассматривал возможность обмена через текстовый файл, меня беспокоит только то, что
fileB
придется открывать и читать это каждые 0,2 секунды или около того, что определенно не подходит для SD-карты в Pi, так как она работает 24/7!3. Вы можете держать файл открытым и просто читать его, когда вам нужно. Не нужно его закрывать
4. Тогда второй вариант-это мое лучшее усилие. глобальная переменная, насколько я знаю, большинство программистов ненавидят это. Но я нахожу это очень полезным.
5. «Однако я бы хотел, чтобы это постоянно обновлялось с учетом того, что studiostatus отличается от fileA.py так что линия в fileB.py становится» Это описание слишком много говорит о том, как вы хотите чего-то достичь. Вместо этого попробуйте описать, что вы хотите, чтобы raspberry pi делал. Например, «когда я нажимаю кнопку, включается свет» или что-то в этом роде.
Ответ №1:
Это очень похоже на то, что вы используете модули и глобальные переменные в этих модулях. С учетом этого, как в данном случае, в fileB.py
do:
import .fileA
Теперь fileB имеет доступ к модулю и его переменным через fileA.lt;somethinggt;
. Поскольку модули являются одиночными, обновление значения fileA.studiostatus
должно быть доступно в fileB
, и ваш оператор if должен работать.
Возможно, вам придется переместить while True:
цикл в if __name__ == "__main__"
блок, чтобы избежать запуска цикла при импорте модуля.
Комментарии:
1. но если время
if __name__ == "__main__"
включено, оно не будет выполняться и, следовательно, не актуализируется…
Ответ №2:
Если я правильно понимаю, вы хотите, чтобы свет вспыхивал, когда кто — то находится в здании. Обратите внимание, что в предыдущем предложении не упоминается HTTP, файлы, переменные, GPIO или какие-либо технические детали вашего кода. С этого всегда следует начинать, описывая, что вы хотите сделать.
Теперь поговорим о «как»…на высоком уровне у вас есть дверной звонок, который может отправлять команду в RPi в виде HTTP-запроса. И вам нужно отправить сигнал GPIO на панель управления для включения света.
Похоже, у вас это работает в двух отдельных файлах, которые вы запускаете как отдельные сценарии. Один файл, который управляет светом с помощью контактов GPIO, и другой, который получает HTTP-запросы от звонка в дверь.
Один из способов решить эту проблему-просто запустить скрипт, который мигает огнями, когда Кольцо обнаруживает, что кто-то вошел в дом, и отключить скрипт, когда он обнаруживает, что все ушли.
Другое решение-использовать значение статуса, как у вас, но HTTP-сервер записывает статус в файл, а скрипт GPI считывает его из файла.