You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:23:14