Python while循环不会为此循环或执行

Python while循环不会为此循环或执行,python,python-3.x,while-loop,Python,Python 3.x,While Loop,我正在工作一个系统,应该使我的树莓皮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 __

我正在工作一个系统,应该使我的树莓皮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()
将RPi.GPIO导入为GPIO
导入时间
testPin=18
GPIO.setmode(GPIO.BCM)
GPIO.setup(testPin、GPIO.OUT)
计数器=0
def打开车门():
尝试:
打印(“一切都很好”)
当计数器<900000时:
打印(“一切都很好”)
GPIO.output(测试引脚,GPIO.HIGH)
计数器+=1
除:
打印(“一切正常!”)
最后:
GPIO.cleanup()
我收到的信息是“一切都很好”和“一切正常”,但没有收到“一切都很好”的信息。在我看来,while循环似乎不执行。
有人知道为什么它不工作吗?

计数器不在调用
打开门()的其他文件的范围内,这就是为什么您看到“一切正常!”的原因,因为未知变量是一个异常

<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_应用程序(环境,启动响应)

wsgi_应用程序中的文件“/usr/lib/python3/dist packages/flask/app.py”,第1820行 响应=self.make\u响应(self.handle\u异常(e))

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

reraise(exc_type, exc_value, tb)
reraise(exc_type, exc_value, tb)
文件“/usr/lib/python3/dist-packages/flask/_-compat.py”,第33行,在reraise中 增值

wsgi_应用程序中的文件“/usr/lib/python3/dist packages/flask/app.py”,第1817行 response=self.full\u dispatch\u request()

文件“/usr/lib/python3/dist packages/flask/app.py”,第1477行,完整发送请求

rv = self.handle_user_exception(e)
rv = self.dispatch_request()
return self.view_functions[rule.endpoint](**req.view_args)
文件“/usr/lib/python3/dist packages/flask/app.py”,第1381行,在handle\u user\u异常中

reraise(exc_type, exc_value, tb)
reraise(exc_type, exc_value, tb)
文件“/usr/lib/python3/dist-packages/flask/_-compat.py”,第33行,在reraise中 增值

文件“/usr/lib/python3/dist packages/flask/app.py”,第1475行,完整发送请求

rv = self.handle_user_exception(e)
rv = self.dispatch_request()
return self.view_functions[rule.endpoint](**req.view_args)
文件“/usr/lib/python3/dist packages/flask/app.py”,第1461行,在调度请求中

rv = self.handle_user_exception(e)
rv = self.dispatch_request()
return self.view_functions[rule.endpoint](**req.view_args)
openDeur中的文件“/home/pi/python/Deur/app.py”,第24行 返回渲染模板(“索引”)

文件“/usr/lib/python3/dist packages/flask/templating.py”,第127行,位于render_模板中

return 
_渲染(ctx.app.jinja\u环境获取或选择模板(模板名称或列表)

文件“/usr/lib/python3/dist packages/jinja2/environment.py”,第830行,在get_或_select_模板中

return self.get_template(template_name_or_list, parent, globals)
return self._load_template(name, self.make_globals(globals))
get_模板中的文件“/usr/lib/python3/dist packages/jinja2/environment.py”,第791行

return self.get_template(template_name_or_list, parent, globals)
return self._load_template(name, self.make_globals(globals))
文件“/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行,装入 source,filename,uptodate=self.get\u source(环境,名称)

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

raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound:索引


192.168.1.82-[15/Dec/2017 23:27:44]“开门/开门

调试器=yes&cmd=resource&f=style.css HTTP/1.1“200-


192.168.1.82-[15/Dec/2017 23:27:45]“开门/开门

调试器=yes&cmd=resource&f=jquery.js HTTP/1.1“200-


192.168.1.82-[15/Dec/2017 23:27:45]“开门/开门

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


192.168.1.82-[15/Dec/2017 23:27:45]“开门/开门

调试器=yes&cmd=resource&f=console.png HTTP/1.1“200-


192.168.1.82-[15/Dec/2017 23:27:45]“开门/开门


调试器=yes&cmd=resource&f=source.png HTTP/1.1“200-

tl;dr-计数器未初始化,因为只调用了该方法

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

例如,以以下两个程序为例:

bar.py:

counter = 0
def count():
    while (counter < 5):
        print(counter)
        counter += 1
class MyClass:
    def __init__(self):
        self.__counter = 0
    def count(self, limit):
        while (self.__counter < limit):
            print(self.__counter)
            self.__counter += 1
收到的输出将是:

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
我建议创建一个类,将变量作为内部字段保存,并包含open_door方法

bar.py:

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

py foobar.py:
0
1
2    

如果您收到的是“OK”消息,这意味着出现了错误。如果错误发生在“良好”消息之前,它将不会打印。@Carcigenicate我又运行了一次,并且我在终端中得到的内容在这条评论中有点长,但在下面的评论中,所以我应该包括open\u door(计数器)要让它工作?这取决于你想对计数器做什么。如果你想总是迭代900000次,那么你可以对范围(900000)内的i执行
为什么你甚至需要计数器?你还可以将计数器的声明移到
打开的门()中
功能。我将其连接到一个继电器,该继电器将形成一个短路来停用锁。如果我这样做太短,锁将不会被停用,因此大约1或2秒就可以了。我的整个项目可以在这里找到:嗯,很有趣,是的,然后用范围内(900000)的I的
替换计数器和while循环记住,你所做的是“忙着等待”循环,除了你需要“等待”1-2秒的事实之外,你可以考虑的其他事情是把锁短路,“睡觉”1-2秒(让系统短路),然后在1-2秒后醒来,关闭锁。