【问题标题】:how to write or create (when no exist) a file using python and Google AppEngine如何使用 python 和 Google AppEngine 编写或创建(如果不存在)文件
【发布时间】:2010-04-21 03:55:48
【问题描述】:

这是我的代码:

f = open('text/a.log', 'wb')
f.write('hahaha')
f.close()

不存在时不创建新文件

如何做到这一点,

谢谢

更新

class MyThread(threading.Thread):
    def run(self):
        f = open('a.log', 'w')
        f.write('hahaha')
        f.close()

错误是:

Traceback (most recent call last):
  File "D:\Python25\lib\threading.py", line 486, in __bootstrap_inner
    self.run()
  File "D:\zjm_code\helloworld\views.py", line 15, in run
    f = open('a.log', 'w')
  File "d:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1188, in __init__
    raise IOError('invalid mode: %s' % mode)
IOError: invalid mode: w

【问题讨论】:

  • hmm,在这里可以用...也许你可以检查一下你是否有权限在那个目录下写?
  • 检查您当前的工作目录。确保有一个文本子目录。确保您能够读取和写入文本目录。如果该目录中已经有文件 a.log,请确保您能够写入该文件。祝你好运。
  • 您可以向我们展示回溯吗?回溯包含有价值的信息

标签: python google-app-engine file


【解决方案1】:

您正在使用 Google App Engine。

来自Google App Engine documentation

沙盒

应用程序在安全环境中运行,该环境提供对底层操作系统的有限访问。这些限制允许 App Engine 跨多个服务器分发应用程序的 Web 请求,并启动和停止服务器以满足流量需求。沙盒将您的应用程序隔离在其自身安全、可靠的环境中,该环境独立于 Web 服务器的硬件、操作系统和物理位置。 安全沙盒环境的限制示例包括:

  • 应用程序无法写入文件系统。 应用程序可以读取文件,但只能读取随应用程序代码上传的文件。 应用程序必须使用 App Engine 数据存储区、内存缓存或其他服务来存储请求之间持续存在的所有数据。

【讨论】:

  • 如果你想证明看看堆栈跟踪:File "d:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1188, in __init__
【解决方案2】:

这是因为 google appengine 不允许你写文件

它的定义是这样的

ALLOWED_MODES = frozenset(['r', 'rb', 'U', 'rU'])

if mode not in FakeFile.ALLOWED_MODES:
  raise IOError('invalid mode: %s' % mode)

注意:'U'是通用换行模式,http://docs.python.org/library/io.html#io.open

编辑:您可能会对他们的文档中的 Google AppEngine Logging session 感兴趣

例子

import logging
....
logging.error('There was an error retrieving ...')
logging.debug('Finish something')

【讨论】:

  • 你先生太酷了! +1 用于在错误消息中发现 appengine!
  • 谷歌人?这是否意味着“我正在使用谷歌并回答你”或“我来自谷歌?”还是“谷歌手册页”?
  • @S.Mark.可能是第二个。
  • 如果 Google 自己屏蔽了会很有趣 :)(查看 S.Mark 的个人资料)
【解决方案3】:

你没有显示你得到的错误;尽管社区在此处和之前的问题中恳求您这样做。

我预计您会收到 IOError,因为尚未创建 text 目录。

改用这样的东西:

from __future__ import with_statement
import os

dir = 'text'
filename = 'a.log'
log_path = os.path.join(dir, filename)

if not os.path.exists(dir):
    os.makedirs(dir)

with open(log_path, 'w') as f:
    f.write("Nobody expects the Spanish inquisition!")

注意事项:
用斜杠连接路径是编写不能跨平台工作的代码的好方法。

使用with statement 打开文件。该文件在with 块的末尾关闭。在 版本中使用 from __future__ import with_statement

【讨论】:

    【解决方案4】:

    “文本”的相对目录路径似乎很可能不存在。请检查 DIR 路径,然后以写入模式打开文件。

    【讨论】:

      【解决方案5】:

      同意@bp 和@S.Mark:App Engine 不允许您创建文件...期间。除了@bp 指出的页面之外,它还记录在其他几个地方:

      http://code.google.com/appengine/docs/java/overview.html http://code.google.com/appengine/docs/python/overview.html

      具体来说,这些页面声明,“...应用程序不能生成线程、将数据写入本地文件系统或进行任意网络连接。”

      有趣的是,OP 尝试了 3 个中的 2 个。:-)

      但是,如果您想要某些文件,则需要将它们与您的应用一起上传,可以是单个文件,也可以是一堆放入 ZIP 存档的文件。最后,如果您的文件非常大,不妨考虑使用 Blobstore(每个文件最多 50MB):

      http://code.google.com/appengine/docs/python/blobstore/ http://code.google.com/appengine/docs/java/blobstore/

      【讨论】:

        猜你喜欢
        • 2015-06-01
        • 2021-04-23
        • 2015-09-12
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        • 2014-11-24
        • 2011-04-24
        • 2011-03-13
        相关资源
        最近更新 更多