Flask配置GPIO时遇UnboundLocalError:变量未定义问题求助
问题原因
- 变量作用域限制:
before_first_request函数内定义的pwmOne和pwmOneDutyCycle是局部变量,函数执行完毕后这些变量会被销毁,路由函数remoteInput无法访问局部作用域内的变量,因此触发未定义错误。 - 额外注意:原代码里
@app.before_first_request()多了括号,正确装饰器写法是@app.before_first_request(不带括号),这个语法错误会导致服务启动失败,你当前的变量未定义报错应该是修正该语法后的情况。
解决建议
以下方案都能保证GPIO和PWM仅初始化一次,同时让路由函数正常访问变量:
方案1:使用全局变量
在模块层面声明变量,在初始化函数里赋值,路由函数通过global关键字访问:
from flask import Flask from flask import request import RPi.GPIO as GPIO app = Flask(__name__) # 模块级全局变量 pwmOne = None pwmOneDutyCycle = 0 @app.before_first_request def init_gpio(): global pwmOne, pwmOneDutyCycle GPIO.setmode(GPIO.BCM) pwmOne = GPIO.PWM(12, 100) pwmOneDutyCycle = 0 pwmOne.start(pwmOneDutyCycle) @app.route('/', methods=['GET', 'POST']) def remote_input(): global pwmOne, pwmOneDutyCycle if request.method == 'POST': # 限制占空比在0-100之间 if pwmOneDutyCycle < 100: pwmOneDutyCycle += 10 pwmOne.ChangeDutyCycle(pwmOneDutyCycle) return f"当前占空比: {pwmOneDutyCycle}%"
方案2:绑定变量到Flask app实例
把变量存在app对象的属性里,避免使用全局变量:
from flask import Flask from flask import request import RPi.GPIO as GPIO app = Flask(__name__) @app.before_first_request def init_gpio(): GPIO.setmode(GPIO.BCM) app.pwm_one = GPIO.PWM(12, 100) app.pwm_duty_cycle = 0 app.pwm_one.start(app.pwm_duty_cycle) @app.route('/', methods=['GET', 'POST']) def remote_input(): if request.method == 'POST': if app.pwm_duty_cycle < 100: app.pwm_duty_cycle += 10 app.pwm_one.ChangeDutyCycle(app.pwm_duty_cycle) return f"当前占空比: {app.pwm_duty_cycle}%"
可选:添加GPIO资源清理
为防止程序退出时GPIO资源残留,可添加清理函数:
@app.teardown_appcontext def cleanup_gpio(exception): GPIO.cleanup()
内容的提问来源于stack exchange,提问作者Bryan Turns
相关产品推荐
相关产品推荐

