如何从外部脚本终止while循环?跨脚本控制blink函数停止
我来帮你搞定终止blink循环的问题!你想用变量控制循环的思路是对的,但大概率是踩了线程阻塞或者语法/作用域的坑,下面给你具体的修复方案:
核心问题分析
- 你写的
while x = "0"是赋值操作,不是判断逻辑,这会让循环永远为真,根本停不下来——必须改成while x == "0" - 如果直接调用blink函数,它会卡在while循环里,导致后续的off函数根本没机会执行,所以必须把blink放到单独线程里跑
修改后的control.py代码片段
from ConfigParser import SafeConfigParser from SimpleXMLRPCServer import SimpleXMLRPCServer import RPi.GPIO as GPIO from time import sleep import xmlrpclib import threading # 新增:导入线程模块 # 全局控制开关,用布尔值比字符串更直观 blink_active = True def setup_gpio(led_pin): # 补全你的GPIO初始化逻辑,比如设置引脚模式 GPIO.setmode(GPIO.BCM) GPIO.setup(led_pin, GPIO.OUT) def blink(led_pin=18): # 假设你的LED接在18号引脚 global blink_active setup_gpio(led_pin) try: # 这里用双等号做判断,之前的单等号是致命错误! while blink_active: GPIO.output(led_pin, GPIO.HIGH) sleep(0.5) GPIO.output(led_pin, GPIO.LOW) sleep(0.5) finally: # 确保循环退出时清理GPIO资源 GPIO.cleanup() def off(led_pin=18): global blink_active # 先把控制开关关掉,终止循环 blink_active = False # 直接关闭LED并清理GPIO GPIO.output(led_pin, GPIO.LOW) GPIO.cleanup() # 注册XML-RPC服务(如果你的场景用这个的话) server = SimpleXMLRPCServer(('0.0.0.0', 8000)) server.register_function(blink, 'blink') server.register_function(off, 'off') if __name__ == '__main__': server.serve_forever()
main.py的调用方式(关键!)
因为XML-RPC是同步调用,直接client.blink()会卡住主线程,所以必须用线程启动blink:
import xmlrpclib import threading # 连接你的树莓派RPC服务 client = xmlrpclib.ServerProxy('http://你的树莓派IP:8000/') # 用线程启动blink,避免阻塞主线程 blink_thread = threading.Thread(target=client.blink, args=(18,)) # 传引脚参数 blink_thread.start() # 当需要停止时,调用off函数 # 比如你可以加个输入判断,或者定时调用 input("按回车键停止闪烁...") client.off(18) blink_thread.join() # 等待线程结束
额外注意事项
- 一定要在blink和off函数里用
global关键字声明全局变量,不然会创建局部变量,根本改不了全局的控制开关 - 记得替换代码里的引脚号为你实际使用的GPIO引脚
- 每次修改代码后重启RPC服务,避免旧代码残留
内容的提问来源于stack exchange,提问作者shaggs
相关产品推荐
相关产品推荐

