我使用来自web.py的内置Web服务器,而不是像这个问题那样使用apache:Apache中web.py的全局变量用法
我有一个使用数字作为参数的Web服务,将其添加到内部变量中number
并返回该变量。
脚本如下所示:
import web
import sys
urls = (
'/(\d+)', 'Number'
)
class Number:
def GET(self, parameter):
# I want to read and write to the variable number here
print "number in web service is " + str(number)
number = number + int(parameter)
return number
if __name__ == "__main__":
#print sys.argv
# I want to initialise the variable number here, based on command line parameter
number = int(sys.argv[2]) if len(sys.argv) >= 3 else 0 # initialisation
print "number init value " + str(number)
app = web.application(urls, globals())
app.run()
我像这样启动服务器:
sudo python test.py 192.168.0.100 16
16
内部计数器的初始值在哪里。
当这样执行时:
http://192.168.0.100:8080/42
我UnboundLocalError: local variable 'number' referenced before assignment
在这条线上
print "number in web service is " + str(number)
好的,所以我需要global
,因为我不想number
成为服务的局部变量,所以我更改为:
import web
import sys
urls = (
'/(\d+)', 'Number'
)
class Number:
def GET(self, parameter):
# I want to read and write to the variable number here
global number # number is not a lcoal variable
print "number in web service is " + str(number)
number = number + int(parameter)
return number
if __name__ == "__main__":
#print sys.argv
# I want to initialise the variable number here, based on command line parameter
number = int(sys.argv[2]) if len(sys.argv) >= 3 else 0 # initialisation
print "number init value " + str(number)
app = web.application(urls, globals())
app.run()
现在,在同一行上调用服务时出现另一个错误NameError: global name 'number' is not defined
。为了解决这个问题,我在顶部添加了一个初始化:
import web
import sys
urls = (
'/(\d+)', 'Number'
)
number = 0 # assigning value to define variable
class Number:
def GET(self, parameter):
# I want to read and write to the variable number here
global number # number is not a lcoal variable
print "number in web service is " + str(number)
number = number + int(parameter)
return number
if __name__ == "__main__":
#print sys.argv
# I want to initialise the variable number here, based on command line parameter
number = int(sys.argv[2]) if len(sys.argv) >= 3 else 0 # initialisation
print "number init value " + str(number)
app = web.application(urls, globals())
app.run()
虽然我现在没有收到错误,但逻辑已损坏。number init value is 16
它说,当初始打印显示该值时,其他打印没有相同的值number in web service is 0
。
显然,number
我的代码中有两个单独的变量。我发现这个答案指出这__main__
是一个单独的模块。现在说明的不同值number
。但是,当我尝试添加global
到时__main__
,如下所示:
import web
import sys
urls = (
'/(\d+)', 'Number'
)
number = 0 # assigning value to define variable
class Number:
def GET(self, parameter):
# I want to read and write to the variable number here
global number # number is not a lcoal variable
print "number in web service is " + str(number)
number = number + int(parameter)
return number
if __name__ == "__main__":
#print sys.argv
# I want to initialise the variable number here, based on command line parameter
global number # I want that one global variable number
number = int(sys.argv[2]) if len(sys.argv) >= 3 else 0 # initialisation
print "number init value " + str(number)
app = web.application(urls, globals())
app.run()
该值在初始化时再次为16,在服务中再次为0。我SyntaxWarning: name 'number' is assigned to before global declaration
在那条新线上__main__
因此,我再次摆脱了顶部的任务,这实际上并没有必要。因为真正的初始化发生在__main__
:
import web
import sys
urls = (
'/(\d+)', 'Number'
)
class Number:
def GET(self, parameter):
# I want to read and write to the variable number here
global number # number is not a lcoal variable
print "number in web service is " + str(number)
number = number + int(parameter)
return number
if __name__ == "__main__":
#print sys.argv
# I want to initialise the variable number here, based on command line parameter
global number # I want that one global variable number
number = int(sys.argv[2]) if len(sys.argv) >= 3 else 0 # initialisation
print "number init value " + str(number)
app = web.application(urls, globals())
app.run()
虽然最初执行时没有警告,但确实NameError global name 'number' is not defined
从GET
方法中获得了a 。
如何创建一个可以设置的变量,__main__
并且还可以从同一文件中定义的类的方法读取和写入该变量?
问题是因为自动重新加载的只是把它放在文件的顶部,一切都应该工作
import web
import sys
number = int(sys.argv[2]) if len(sys.argv) >= 3 else 0 #initialisation
urls = (
'/(\d+)', 'Number'
)
... #the rest of the file
您会看到,重新加载器将执行“ reload(yourmodule)”,因此不会再次调用__main__部分:(
干杯
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句