while循环不循环或执行

问题描述 投票:1回答:3

我正在使用一个系统,它应该使我的一个覆盆子pi GPIO引脚变为高电平约2秒钟。我把它分成两个不同的文件。 “网站”文件(名为app.py)和“GPIO”文件(名为test.ty)。以这种方式请求测试文件:

from flask import Flask, render_template
from test import open_door

app = Flask(__name__)

@app.route('/opendoor')
def openDoor():
    open_door()


if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')

test.py文件如下所示:

import RPi.GPIO as GPIO
import time

testPin = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(testPin, GPIO.OUT)

counter =0

def open_door():
    try:
        print ("Everthing is fine")
        while counter < 900000:
             print ("Everything is good")
             GPIO.output(testPin, GPIO.HIGH)

             counter += 1

    except:
        print ("Everything is oke!")

    finally:
        GPIO.cleanup()

我收到消息“一切都很好”,“一切都好!”但不是“一切都好”的信息。在我看来,while循环不会执行。任何人都知道为什么它不起作用?

python python-3.x while-loop
3个回答
3
投票

counter不在您调用open_door()的其他文件的范围内,这就是为什么你看到“一切都好!”因为未知变量是一个例外


1
投票

tl; dr - counter未初始化,因为只调用了该方法。

Python是一种解释器语言。通过从test.py导入open_door,您只需要包含open_door函数中定义的代码。

例如,采取以下两个程序:

把人.朋友:

counter = 0
def count():
    while (counter < 5):
        print(counter)
        counter += 1

foobar.朋友:

from bar import count
count()

收到的输出将是:

py foobar.py
Traceback (most recent call last):
  File "foobar.py", line 2, in <module>
    sayHey()
  File "C:\Temp\bar.py", line 3, in sayHey
    while (counter < 5):
UnboundLocalError: local variable 'counter' referenced before assignment

但是,通过将变量定义移动到方法中,我们将获得以下输出:

py foobar.py
0
1
2
3
4

我建议创建一个将变量保存为内部字段并包含open_door方法的类。

把人.朋友:

class MyClass:
    def __init__(self):
        self.__counter = 0
    def count(self, limit):
        while (self.__counter < limit):
            print(self.__counter)
            self.__counter += 1

foobar.朋友:

from bar import MyClass
driver = MyClass()
driver.count(3)

现在:

py foobar.py:
0
1
2    

-1
投票

192.168.1.82 - - [15 / Dec / 2017 23:27:42]“GET / deur / open HTTP / 1.1”200 -

这很好用

一切都好!

192.168.1.82 - - [15 / Dec / 2017 23:27:44]“GET / opendoor HTTP / 1.1”500 - 回溯(最近一次呼叫最后):

文件“/usr/lib/python3/dist-packages/flask/app.py”,第1836行,在调用中返回self.wsgi_app(environ,start_response)

文件“/usr/lib/python3/dist-packages/flask/app.py”,第1820行,在wsgi_app response = self.make_response(self.handle_exception(e))

在handle_exception中的文件“/usr/lib/python3/dist-packages/flask/app.py”,第1403行

reraise(exc_type, exc_value, tb)

文件“/usr/lib/python3/dist-packages/flask/_compat.py”,第33行,重新加注价值

文件“/usr/lib/python3/dist-packages/flask/app.py”,第1817行,在wsgi_app response = self.full_dispatch_request()中

在full_dispatch_request中输入文件“/usr/lib/python3/dist-packages/flask/app.py”,第1477行

rv = self.handle_user_exception(e)

在handle_user_exception中的文件“/usr/lib/python3/dist-packages/flask/app.py”,第1381行

reraise(exc_type, exc_value, tb)

文件“/usr/lib/python3/dist-packages/flask/_compat.py”,第33行,重新加注价值

在full_dispatch_request中输入文件“/usr/lib/python3/dist-packages/flask/app.py”,第1475行

rv = self.dispatch_request()

在dispatch_request中输入文件“/usr/lib/python3/dist-packages/flask/app.py”,第1461行

return self.view_functions[rule.endpoint](**req.view_args)

文件“/home/pi/python/Deur/app.py”,第24行,在openDeur中返回render_template('index')

在render_template中输入文件“/usr/lib/python3/dist-packages/flask/templating.py”,第127行

return 

_render(ctx.app.jinja_env.get_or_select_template(template_name_or_list),

在get_or_select_template中输入文件“/usr/lib/python3/dist-packages/jinja2/environment.py”,第830行

return self.get_template(template_name_or_list, parent, globals)

在get_template中输入文件“/usr/lib/python3/dist-packages/jinja2/environment.py”,第791行

return self._load_template(name, self.make_globals(globals))

在_load_template中输入文件“/usr/lib/python3/dist-packages/jinja2/environment.py”,第765行

template = self.loader.load(self, name, globals)

文件“/usr/lib/python3/dist-packages/jinja2/loaders.py”,第113行,加载源,文件名,uptodate = self.get_source(环境,名称)

在get_source中输入文件“/usr/lib/python3/dist-packages/flask/templating.py”,第64行

raise TemplateNotFound(template)

jinja2.exceptions.TemplateNotFound:index

192.168.1.82 - - [15 / Dec / 2017 23:27:44]“GET / opendoor?

debugger = yes&cmd = resource&f = style.css HTTP / 1.1“200 -

192.168.1.82 - - [15 / Dec / 2017 23:27:45]“GET / opendoor?

debugger = yes&cmd = resource&f = jquery.js HTTP / 1.1“200 -

192.168.1.82 - - [15 / Dec / 2017 23:27:45]“GET / opendoor?

debugger = yes&cmd = resource&f = debugger.js HTTP / 1.1“200 -

192.168.1.82 - - [15 / Dec / 2017 23:27:45]“GET / opendoor?

debugger = yes&cmd = resource&f = console.png HTTP / 1.1“200 -

192.168.1.82 - - [15 / Dec / 2017 23:27:45]“GET / opendoor?

debugger = yes&cmd = resource&f = source.png HTTP / 1.1“200 -

© www.soinside.com 2019 - 2024. All rights reserved.