关于python变量作用域

RaspiSQH 117.85m2020-03-19996 次点击
# -*- 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 117.85m 2020-03-19 
@Spoony
但是我把input放import那里,这段imput的程序就会执行两遍。
只有放在if __name__ == "__main__":里才会执行一遍,所以才放在下面的.....
看了一下,好像是web.py的原因。我再研究下。
Spoony 小组长 2020-03-19 
@RaspiSQH 放 import 那里的话,if 里面的 input 是不是还没有去掉?
RaspiSQH 117.85m 2020-03-19 
@Spoony
去掉了。网上也有人说这个问题,然后我在input外加if __name__ == "__main__":试了一下,不会执行两次,但是这样的话get()又找不到addr了。。。
但是不加就是好的。
RaspiSQH 117.85m 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