Используйте переменную из цикла While True в другом файле

#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 считывает его из файла.