2011-04-21 48 views
4

我在S3上创建了一个密钥。S3的BOTO在尝试复制现有密钥时正在返回NoSuchKey

mykey.exists()回报true

mykey.get_contents_to_filename()生成一个文件,该文件是正确的

但是:

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

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

它看起来像我采用B oto 2.0b4 如果密钥存在,为什么我会收到NoSuchKey错误? 我错过了什么?

编辑:在关键的名字到foreslashes变化反斜杠,我实际使用

回答

0

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

如果你真的想让你的keyname为“\ backup \ file”,可以在Python中将它指定为r'\ backup \ file'。这将它视为原始字符串,并且不会发生转义处理。

+0

对不起,这是我的Windows背景显示通过。我实际上使用的是前斜杠而不是反斜杠。但即使假设我使用反斜杠,为什么.exists()会工作,但不是.copy()? – ChrisMcB 2011-04-27 03:58:21

+0

这很奇怪。我无法在本地环境中的boto 2.0b4中重现这一点,但显然有些问题。 mykey代表的对象的实际名称是什么? – garnaat 2011-04-28 08:38:42

1

我有一个理论,因为亚马逊S3最终是一致的,一个请求可以看到关键字(.exists()== True),而另一个请求结束在不知道新的不同的S3服务器关键字(不一致的读取 - 这是最终一致的数据存储的难点,这是s3的一个已知行为,其中后跟一个head/get,我期望它也可以保留以用于复制。)通常很短(但不确定)一段时间所有请求都会看到你的密钥。通常这只是一两秒钟。在exists()检查和复制之间放置30秒的代码超时。它还会发生吗?

这里描述的问题:https://forums.aws.amazon.com/thread.jspa?threadID=21634&tstart=0

相关问题