所以我正在编写一个脚本来下载一个文件,如果它没有完成,则从它停止的地方重新开始下载。那部分已经处理好了。
我把所有这些部分都拿出来只显示不起作用的部分。我刚刚制作的亚马逊网址,所以如果你运行它,它实际上不会下载任何东西,但是用实际的下载链接替换网址,会:
import urllib
import time
import os
file_name = "setup.exe"
web_page = urllib.FancyURLopener().open("https://s3.amazonaws.com/some_bucket/files/"+file_name)
while True:
data = web_page.read(8192)
if not data:
print "done"
break
#print os.getcwd()
with open(file_name, "ab") as outputFile:
outputFile.write(data)
#print "going..."
#time.sleep(1)
发生的情况是(这仅在尝试下载 EXE 文件时),该过程将从 web_page 读取看似随机的次数(在 1 到 20 次之间),然后抛出 IOError: 13, Permission denied。同样,使用 .gif 或 .mov 或我测试过的其他一些东西,永远不会抛出权限被拒绝错误。
此外,取消注释 time.sleep(1) 行可以解决问题。就好像 with 语句在继续之前没有完全关闭文件。
我认为 with 语句应该处理关闭,不是吗?
我还认为,也许我当前的目录正在以某种方式被更改,但取消注释永远不会显示它(尽管按照相同的逻辑,它不一定必须这样做)。
(还有什么奇怪的是,如果我从桌面运行这个脚本[以便它也写入桌面]并在它前面打开 Aptana,权限被拒绝错误不会发生,但第二次我将文本编辑器最小化为聚焦桌面,抛出错误——我将此归因于 Aptana 在打开时占用了大量资源,因此减慢了其他进程并且有点像 time.sleep??)
非常感谢您的任何指点。