【问题标题】:ImportError - No module named main in GAEImportError - GAE 中没有名为 main 的模块
【发布时间】:2013-06-23 23:33:39
【问题描述】:

在我的 Google App Engine 应用中,我收到了错误

ImportError: 没有名为 main 的模块

访问 URL /foo 时。我的应用程序中的所有文件都在父目录中。

这是我的app.yaml

application: foobar
version: 1
runtime: python27
api_version: 1
threadsafe: no

handlers:

- url: /foo.*
  script: main.application

- url: /
  static_files: index.html

- url: /(.*\.(html|css|js|gif|jpg|png|ico))
  static_files: \1
  upload: .*
  expiration: "1d"

这是我的main.py

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

class Handler(webapp.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write('Hello world!') 

def main():
    application = webapp.WSGIApplication([('/foo', Handler)],
                                         debug=False)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

当我将main.application 更改为main.py 或只是main 时,我得到了同样的错误。为什么会出现这个错误?

【问题讨论】:

    标签: python google-app-engine importerror


    【解决方案1】:

    您的配置没问题 - 只是main.py 中的一个小错误:您需要从main 模块访问application 名称,因此配置为:main.application。此更改应该可以解决问题:

    application = webapp.WSGIApplication([('/foo', Handler)],
                                         debug=False)
    def main():
        util.run_wsgi_app(application)
    

    别担心 - application 对象在创建时不会运行,也不会在从此模块导入时运行,它只会在显式所有对象上运行,例如 .run_wsgi_app 或在谷歌的内部架构中.

    【讨论】:

      【解决方案2】:

      看看python27的入门。你混合 CGI 和 WSGI。你必须在这里使用 webapp2。

      你的 WSGI main.py :

      import webapp2
      
      class Handler(webapp2.RequestHandler):
      
          def get(self):
              self.response.headers['Content-Type'] = 'text/plain'
              self.response.write('Hello World!')
      
      
      application = webapp2.WSGIApplication([
          ('/foo', Handler),
      ], debug=True)
      

      另请参阅有关 CGI 和 WSGI 的博客文章:http://blog.notdot.net/2011/10/Migrating-to-Python-2-7-part-1-Threadsafe

      【讨论】:

      • 谢谢,我应该使用 webapp2。但是,它仍然不起作用。 hello world example 工作正常;当 python 脚本不是主要的请求处理程序(即仅适用于/foo.*)时,问题似乎会发生
      • 请解释一下。你是什​​么意思:“当python脚本不是主要请求处理程序时”
      • 同理,它只处理以/foo 开头的URL,而不是基本URL /
      • 但是您没有为“/”创建处理程序,那么:ImportError: No module named main?这个问题解决了吗?
      • index.html 是/ 的处理程序。问题没有解决。
      【解决方案3】:

      正如documentation 所说,

      静态文件不能与应用程序代码文件相同。如果一个静态 文件路径匹配动态处理程序中使用的脚本的路径, 动态处理程序将无法使用脚本。

      在我的例子中,问题在于这条线

      upload: .*
      

      匹配我父目录中的所有文件,包括 main.py。这意味着 main.py 对动态处理程序不可用。修复方法是将此行更改为仅识别此规则的 URL 行识别的相同文件:

      upload: .*\.(html|css|js|gif|jpg|png|ico)
      

      【讨论】:

        猜你喜欢
        • 2015-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 2012-04-26
        相关资源
        最近更新 更多