Python while循环不会为此循环或执行
我正在工作一个系统,应该使我的树莓皮GPIO引脚之一高约2秒。我把它分成两个不同的文件。“网站”文件(名为app.py)和“GPIO”文件(名为test.ty)。通过以下方式请求测试文件: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 __
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秒后醒来,关闭锁。