在另一个文件中使用While True循环中的变量。

3

我有一个主文件 fileA.py,根据GPIO触发器控制广播室的灯光。我关心的部分在下面的While 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 > 7200:
        dbo()
        clockoff()
        studiostatus = "offline"

同时,在同一台树莓派上,我还有第二个 Python 文件 fileB.py 正在运行。

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()

然而,我希望这能够根据fileA.py中的studiostatus变量持续更新,以便fileB.py中的行变成:

if self.path == '/doorbell' and studiostatus = "online":
    action1()
elif self.path == '/doorbell' and studiostatus = "offline":
    action2()

非常感谢任何帮助,因为目前我无法看清最好的处理方式。


一种不太优雅的解决方案是通过文件交换数据。比如将变量数据写入 .txt 文件,然后从另一个脚本中读取它。更加不优雅的解决方案是将循环放在一个函数中,在 fileB 中导入 fileA 并在声明所需变量为全局变量的同时运行该函数。 - Abdur Rakib
我考虑过通过文本文件进行交换,但我的唯一担忧是fileB每0.2秒左右就必须打开并读取它,这对于运行24/7的树莓派SD卡来说绝对不好! - Adam Davies
你可以保持文件打开,需要时只需阅读它。无需关闭。 - Alexandru DuDu
然后第二个选项是我最好的努力。据我所知,大多数程序员都讨厌全局变量。但我发现它非常有用。 - Abdur Rakib
然而,我希望这可以持续更新来自fileA.py的studiostatus变量,以便fileB.py中的行变为。这个描述过于关注你想要如何完成某件事情。相反,尝试描述你希望树莓派做什么。例如,“当我按下按钮时,灯会亮起”或类似的内容。 - Code-Apprentice
显示剩余3条评论
1个回答

1
如果我理解正确,您希望有些灯在有人进入建筑物时闪烁。请注意,前面的句子没有提到HTTP、文件、变量、GPIO或任何技术细节。这通常是描述您想要做什么的起点。
现在来谈谈“如何”……在高层次上,您有一个可以将命令作为HTTP请求发送到RPi的门铃,并且需要向控制灯光的GPIO发送信号。
看起来您已经在两个单独的文件中运行了控制GPIO引脚的灯光的一个文件和接收Ring门铃的HTTP请求的另一个文件。
解决此问题的一种方法是仅在Ring检测到有人进入房屋时启动闪烁灯光的脚本,并在检测到每个人离开时停止脚本。
另一种解决方案是像您所做的那样使用状态值,但HTTP服务器将状态写入文件,而GPI脚本从文件中读取状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接