使用Python在App Engine上读取文件?

Pan*_*Jee 39 python google-app-engine

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

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

os.stat(f,'r').st_mtim
Run Code Online (Sandbox Code Playgroud)

Woo*_*ble 54

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

2014年11月更新:

正如评论中所建议的那样,您现在可以使用application_readable标志执行此操作:

application_readable
Run Code Online (Sandbox Code Playgroud)

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

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

  • 实际上你现在可以使用``application_readable:true`,考虑更新你的答案,请参阅https://developers.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers (10认同)
  • 您在本地副本中创建符号链接; 这些文件实际上会被复制两次到App Engine:一次复制到静态文件服务器,一次复制到应用程序服务器.您还可以通过将本地副本符号链接到应用程序目录来包含外部包,而不是将整个包复制到使用它的每个项目. (7认同)
  • 这看起来不像是如何"用Python在App Engine上读取文件?"的答案. (4认同)

MSt*_*odd 11

你可以阅读文件,但它们是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()
Run Code Online (Sandbox Code Playgroud)

  • 除了静态文件不可用外,应用程序的文件访问没有什么异常. (7认同)

jon*_*ada 6

+1为新的"application_readable:true"功能.在使用这个新功能之前,我确实遇到了GAE" 古怪 "文件系统的问题,同时导入了NLP Montylingua.

问题:Monty使用open(filename,'rb')和来自静态文件的file_ptr.read()文件指针.我的实现在我的本地Windows系统上工作但在部署时失败了!

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

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