【问题标题】:Read a file on App Engine with Python?使用 Python 在 App Engine 上读取文件?
【发布时间】:2011-02-07 11:34:13
【问题描述】:

是否可以在 GAE 上打开文件只是为了读取其内容并获取最后修改的标签?

我得到一个 IOError: [Errno 13] 文件不可访问: 我知道我不能删除或更新,但我相信阅读应该是可能的 有没有人遇到过类似的问题?

os.stat(f,'r').st_mtim

【问题讨论】:

  • 尝试使用相对目录并确保它在您的应用程序中,而不是根目录
  • 我已经尝试过,当我遇到路径问题时,我会得到 otehr Errno 2
  • 一位 Google 员工回复说您无法读取标记为静态的文件。但那是我的问题,因为我想打开我的 JS/CSS 文件。如果我找到smth我会告诉你的
  • 请不要向群组发帖,所以请选择一个,除非您没有得到答案。
  • 如果您不将这些文件用作静态文件,则可以读取它们。如果您将它们用作静态文件,则可以使用 application_readable 来访问它们。但如果您不知道,问题可能在于文件系统区分大小写。

标签: python google-app-engine


【解决方案1】:

当文件还没有被标记为静态并且您尝试在模式'rt' 下读取它时,我看不到答案;显然那是行不通的。但是,您可以'rb' 模式下正常打开文件,或者只是在'r' 模式下正常打开文件。 (我在那个“t”上浪费了大约 10 分钟。)

【讨论】:

    【解决方案2】:

    对于 webapp2,假设您有 pages/index.htmlmain.py 位于同一路径:

    #!/usr/bin/env python
    
    import webapp2, os
    
    class MainHandler(webapp2.RequestHandler):
        def get(self):
            path = os.path.join(os.path.split(__file__)[0], 'pages/index.html')
            with open(path, 'r') as f:
                page_content = f.read()
            self.response.write(page_content)
    
    app = webapp2.WSGIApplication([
        ('/', MainHandler)
    ], debug=True)
    

    【讨论】:

      【解决方案3】:

      我想出了一个奇怪但有效的解决方案 :) Jinja :)

      直接提供静态文件有时会成为 GAE 的难题。可能的性能权衡让您使用 Jinja 直奔前行

      - url: /posts/(.*\.(md|mdown|markdown)) 
        mime_type: text/plain
        static_files: static/posts/\1
        upload: posts/(.*\.(md|mdown|markdown))
      
      
      
      from jinja2 import Environment
      from jinja2.loaders import FileSystemLoader
      posts = Environment(loader=FileSystemLoader('static/posts/')) # Note that we use static_files folder defined in app.yaml
      post = posts.get_template('2013-11-13.markdown')
      
      import markdown2 # Does not need of course
      
      class Main(webapp2.RequestHandler):
      
          def get ( self ):
              self.response.headers[ 'Content-Type' ] = 'text/html'
      
              self.response.write ( markdown2.markdown( post.render()) )  # Jinja + Markdown Render function
      

      你明白了吗;)我测试过,它有效。

      【讨论】:

        【解决方案4】:

        您可能已在 app.yaml 中将该文件声明为静态文件。静态文件对您的应用程序不可用;如果您需要将它们作为静态文件提供并将它们作为应用程序文件读取,则需要在项目中包含 2 个副本(最好使用符号链接,因此您实际上不必维护实际副本。)

        2014 年 11 月更新:

        按照 cmets 中的建议,您现在可以使用 application_readable 标志执行此操作:

        application_readable
        

        可选。默认情况下,在静态文件处理程序中声明的文件是 作为静态数据上传并仅提供给最终用户,他们不能 被应用程序读取。如果此字段设置为 true,则文件为 也作为代码数据上传,以便您的应用程序可以读取它们。两个都 上传对您的代码和静态数据存储资源收费 配额。

        https://cloud.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers

        【讨论】:

        • 如何在 GAE 环境中使用符号链接?
        • 您在本地副本中创建符号链接;这些文件实际上会被复制两次到 App Engine:一次复制到静态文件服务器,一次复制到应用程序服务器。您还可以通过将本地副本符号链接到应用程序目录来包含外部包,而不是将整个包复制到使用它的每个项目。
        • 其实现在你可以使用``application_readable: true`了,考虑更新你的答案,见developers.google.com/appengine/docs/python/config/…
        • 这看起来不像是关于如何“使用 Python 读取 App Engine 上的文件?”的答案
        • +1 在我的 app.yaml - url: /resources/* static_dir: resources application_readable: true
        【解决方案5】:

        +1 用于新的“application_readable: true”功能。在使用这个新功能之前,我在导入 NLP Montylingua 时确实遇到了 GAE 的“wacky”文件系统问题。

        问题:Monty 使用静态文件中的 open(filename,'rb') 和指向 file_ptr.read() 的文件指针(以字节为单位)。我的实现在我的本地 Windows 系统上运行,但在部署时失败了!

        修复:指定预期的字节来读取 file_ptr.read(4) #4 个二进制字节

        似乎与想要读取更多(默认为 8 个)字节的 64 位 GAE 服务器有关。无论如何,花了一段时间才发现这个问题。 Montylingua 现已加载。

        【讨论】:

          【解决方案6】:

          您可以读取文件,但它们位于 Goooogle 古怪的 GAE 文件系统上,因此您必须使用相对路径。我刚刚在同一个文件夹中创建了一个带有 main.py 文件和 test.txt 的快速应用程序。不要忘记 st_mtime 上的“e”。

          import os
          from google.appengine.ext import webapp
          from google.appengine.ext.webapp import util
          
          
          class MainHandler(webapp.RequestHandler):
          
            def get(self):
              path = os.path.join(os.path.split(__file__)[0], 'test.txt')
          
              self.response.out.write(os.stat(path).st_mtime)
          
          
          def main():
            application = webapp.WSGIApplication([('/', MainHandler)],
                                                 debug=True)
            util.run_wsgi_app(application)
          
          
          if __name__ == '__main__':
            main()
          

          【讨论】:

          • 除了静态文件不可用之外,应用程序的文件访问没有什么异常。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-20
          • 2013-01-26
          • 2011-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多