4

我在 S3 上创建了一个密钥。

mykey.exists()返回true

mykey.get_contents_to_filename()生成正确的文件

但:

mykey.copy('bucket', '/backup/file')

返回: NoSuchKey The Specified key does not exist. Key = mykey

看起来我正在使用 boto 2.0b4 如果密钥存在,为什么会出现NoSuchKey错误?我错过了什么?

编辑:将键名中的反斜杠更改为我实际使用的前斜杠

4

2 回答 2

2

我有一个理论,因为 amazon s3 最终是一致的,所以一个请求可以看到密钥(.exists() == True),而另一个请求最终到达另一个不知道新密钥的 s3 服务器(不一致读取 - 这是最终一致的数据存储的困难。这是 s3 的已知行为,即 put 后​​跟 head/get。我希望它也能保持复制。)通常很短(但不确定)的时间段所有请求都会看到您的密钥。通常这只是大约一两秒。在 exists() 检查和副本之间的代码中设置 30 秒超时。它仍然发生吗?

此处描述了该问题:https ://forums.aws.amazon.com/thread.jspa?threadID=21634&tstart=0 )

于 2012-06-25T06:19:37.523 回答
-1

我认为您的密钥名称可能会遇到问题。字符串 '\backup\file' 中的斜杠字符实际上被解释为字符串转义,因此 '\b' 被替换为 ASCII 退格字符,而 '\f' 被解释为 ASCII 换页符(有关更多详细信息,请参阅内容)。虽然这可能不是您想要的,但它确实应该仍然有效,但是在 boto2.0b4 中转义键名存在一个错误(现在已在 github master 中修复),这阻止了它的工作。

如果您确实希望您的键名是“\backup\file”,请尝试在 Python 中将其指定为 r'\backup\file'。这会将其视为原始字符串,不会发生转义处理。

于 2011-04-26T12:27:24.257 回答