趣小组
[ MAKE ]
首页
节点
分享
创造
问与答
二手交易
编程
电子
树莓派
Arduino
手工
小玩意
ACG 二次元
科学
文化
电影
宠物
旅行
技术支持
登录
注册
首页
编程
关于python变量作用域
RaspiSQH
120.9m
•
2020-03-19
•
1310 次点击
# -*- coding: utf-8 -*- import web import time urls = ( '/dht', 'dht_read' ) app = web.application(urls, globals()) class dht_read: def GET(self): global dht_addr try: temp = open("/sys/devices/platform/"+dht_addr+"/iio:device0/in_temp_input","r").read() humi = open("/sys/devices/platform/"+dht_addr+"/iio:device0/in_humidityrelative_input","r").read() string = "\ntemp="+str(int(temp)/1000.0)+"\nhumi="+str(int(humi)/1000.0)+"%" except: string = "\nFailed\nPlease check the addres or refresh page!" return str(time.ctime())+","+string if __name__ == "__main__": dht_addr = input("please enter your addres:") #global dht_addr app.run() 这样的话在GET()里面,global不起作用,里面的语句得不到dht_addr,下面赋值了也没用。 如果在最下面的if里面加global是会报错,因为在同一个变量作用域内。 但是如果把input放在class前面就可以,但是这个input就会执行两遍,加判断也没用。 这是为什么?
# -*- coding: utf-8 -*-
import web
import time
urls = (
'/dht', 'dht_read'
)
app = web.application(urls, globals())
class dht_read:
def GET(self):
global dht_addr
try:
temp = open("/sys/devices/platform/"+dht_addr+"/iio:device0/in_temp_input","r").read()
humi = open("/sys/devices/platform/"+dht_addr+"/iio:device0/in_humidityrelative_input","r").read()
string = "\ntemp="+str(int(temp)/1000.0)+"\nhumi="+str(int(humi)/1000.0)+"%"
except:
string = "\nFailed\nPlease check the addres or refresh page!"
return str(time.ctime())+","+string
if __name__ == "__main__":
dht_addr = input("please enter your addres:")
#global dht_addr
app.run()
这样的话在GET()里面,global不起作用,里面的语句得不到dht_addr,下面赋值了也没用。
如果在最下面的if里面加global是会报错,因为在同一个变量作用域内。
但是如果把input放在class前面就可以,但是这个input就会执行两遍,加判断也没用。
这是为什么?
收藏
♥ 感谢
Spoony
小组长
2020-03-19
dht_addr 在外面的定义需要放在 import 下面,解释语言,和PHP差不多,他解释到 global 那里只能看到上文的内容,看不到下文的内容的。
RaspiSQH
120.9m
2020-03-19
@Spoony
但是我把input放import那里,这段imput的程序就会执行两遍。
只有放在if __name__ == "__main__":里才会执行一遍,所以才放在下面的.....
看了一下,好像是web.py的原因。我再研究下。
Spoony
小组长
2020-03-19
@RaspiSQH 放 import 那里的话,if 里面的 input 是不是还没有去掉?
RaspiSQH
120.9m
2020-03-19
@Spoony
去掉了。网上也有人说这个问题,然后我在input外加if __name__ == "__main__":试了一下,不会执行两次,但是这样的话get()又找不到addr了。。。
但是不加就是好的。
RaspiSQH
120.9m
2020-03-19
♥ 1
搞定了.....这是因为自动重载功能,加上
web.config.debug = False
即可解决执行两遍的问题。而且必须在创建app前面写。手动狗头
ps.那个pi dashboard daq的main.py好像也有类似问题。报错:SyntaxError: name 'xxx' is assigned to before global declaration
是不是组长写错了......
Spoony
小组长
2020-03-19
@RaspiSQH 可能是写错了,时间太久都记不清了
登录
或
注册
后可回复。
›
GitHub