python - 如何在 __main__ 中创建一个变量,供同一文件中定义的 web.py 类使用?

标签 python scope web.py

我使用 web.py 的内置网络服务器,不是 apache,就像这个问题:Global variable usage with web.py in Apache

我有这个网络服务,它接受一个数字作为参数,将它添加到一个内部变量 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,但另一个打印没有相同的值,它表示 web 服务中的 number 为 0

显然,我的代码中有两个单独的 number 变量。我找到了 this answer声明 __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。 我在 __main__

的新行上收到 SyntaxWarning: name 'number' is assigned to before global declaration

所以我再次摆脱了顶部的分配,这首先并不是真正必要的。因为真正的初始化发生在 __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()

虽然最初执行时没有警告,但我确实从 GET 方法中得到了 NameError global name 'number' is not defined

我如何创建一个变量,我可以在 __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__ 部分不会再次被调用:(

干杯

关于python - 如何在 __main__ 中创建一个变量,供同一文件中定义的 web.py 类使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728621/

相关文章:

python - 使用图表构建交易平台 - 对 Python GUI 库的建议

python - 如何在 Python 中将 2 条提升曲线的图合并为一个图

c# - using 语句可以用大括号代替吗?

javascript - 在 javascript 对象内执行回调函数

python - 执行在 python 中创建的应用程序时出现致命 Python 错误

python - 使用 Selenium 和 python 将文件下载到指定位置

javascript - for 循环和 setTimeout 的范围和时间问题。

python - 使用 web.py 从表单提交启动的进程动态输出值

python - 如何通过 SSH 连接在 VPS 中运行的 Web 服务器运行其他程序?

相当于 Sinatra 的 Python