Python 是否每个包含处理程序的脚本都需要main()呢?

Python 是否每个包含处理程序的脚本都需要main()呢?,python,google-app-engine,httphandler,Python,Google App Engine,Httphandler,有经验的Java程序员尝试学习Python。我在Google App Engine上有一个应用程序,希望将我的管理员处理程序移动到一个单独的文件中。现在我有main.py和admin.py。我已设置app.yaml以正确路由流量,并在每个文件中添加了对WSGIApplication()的调用,以路由到相应的处理程序 我的问题是每个脚本文件是否需要def main()和相应的if语句: application = webapp.WSGIApplication([(r'/admin/(.*)', A

有经验的Java程序员尝试学习Python。我在Google App Engine上有一个应用程序,希望将我的管理员处理程序移动到一个单独的文件中。现在我有main.py和admin.py。我已设置app.yaml以正确路由流量,并在每个文件中添加了对WSGIApplication()的调用,以路由到相应的处理程序

我的问题是每个脚本文件是否需要def main()和相应的if语句:

application = webapp.WSGIApplication([(r'/admin/(.*)', Admin)],
                                       debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

没有必要:您可以:

if __name__ == '__main__':
    run_wsgi_app(application)

我似乎记得读过一篇文章,谷歌推荐使用
main()
函数,因为他们以字节编译的形式缓存它,而不是在每次收到请求时重新编译文件。尽管这对管理员来说可能没有多大区别。

在任何直接引用您的
app.yaml的脚本中,您都需要它

每当App Engine需要向您的脚本之一发送请求时,它都会执行以下步骤:

  • 脚本以前导入过吗?如果没有,只需导入它并停止
  • 如果以前导入过脚本,它是否具有名为
    main
    的函数?如果没有,请再次导入并停止
  • 执行脚本的
    main
    功能
  • 之所以这样做是因为导入模块相对比较昂贵,并且没有必要为每个请求重新导入模块。因此,它提供了一个优化:如果您提供一个名为
    main
    的函数,在第一个请求之后,它将只执行该函数,而不是重新导入脚本。
    if\uuuuu name\uuuu==“\uuuuu main\uuuuu”:
    节用于检测脚本的第一次导入,并手动执行该第一个请求的
    main


    简言之,答案是您可以同时保留
    main
    if
    子句,或者同时包含它们。如果不使用它们,您的应用程序的效率会稍低,但只有在包含其中一个而不是另一个的情况下,您才会遇到问题。

    没有任何东西可以阻止您在app.yaml中根据路径在不同权限级别列出同一脚本文件两次。要稍微重新措辞,不需要使用
    main()
    方法,但是需要一个
    如果uuu name\uuuu=='\uuuu main\uuuu'
    块。@Luke:这取决于谷歌的设置。
    if\uuuu name\uuuuu
    技巧检查您是在导入还是在运行它,我不知道谷歌到底在做什么。但我绝对建议你把它放在适当的位置,这很有道理。我是Python新手。以下是尼克·约翰逊在他的博客上写的:“不是为每个请求重新执行Python可执行文件,而是为多个请求使用单个Python运行时。每个请求只需重新导入应用程序的主处理程序脚本,这将导致重新执行其中的所有代码,尽管从中加载的模块不会重新导入。作为进一步的优化,如果在处理程序模块中提供一个名为“main”的函数,则该函数将在第二次和后续请求中执行,而不是重新导入模块。“谢谢你的详细回答,尼克。我的问题是针对实现RequestHandler的脚本的。但是你是说,任何加载的脚本都应该包含这个习惯用法,以便使导入更有效-正确吗?@任何从
    app.yaml
    引用的脚本。您不需要将它放在包含RequestHandler但不直接执行的脚本中,也不需要放在任何其他脚本中,而不是直接在
    app.yaml
    中列出的脚本中。