2011-04-21 53 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

相關問題