下载可执行文件时有时会出现权限被拒绝
我正在写一个脚本,用来下载文件,如果下载没有完成,就从中断的地方继续下载。这部分我已经解决了。
我把所有其他的部分都去掉了,只留下了不工作的那部分。这里的亚马逊网址是我随便编的,所以如果你运行这个代码,实际上不会下载任何东西,但如果把网址换成一个真实的下载链接,就可以了:
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文件时),这个过程会从网页读取一个看似随机的次数(大约在1到20次之间),然后抛出一个IOError: 13,权限被拒绝的错误。再说一次,对于.gif或.mov文件,或者我测试过的其他一些文件,权限被拒绝的错误从来没有出现过。
另外,取消注释time.sleep(1)这一行就解决了这个问题。就好像with语句在继续之前没有完全关闭文件一样。
我以为with语句应该会处理关闭的事情,不是吗?
我还想,也许我的当前目录被改变了,但取消注释后并没有显示出这一点(不过按照同样的逻辑,它也不一定需要显示)。
(还有一点奇怪的是,如果我从桌面运行这个脚本[这样它也会写入桌面],而且Aptana在前面打开,权限被拒绝的错误就不会出现,但一旦我最小化文本编辑器去关注桌面,错误就会出现——我认为这是因为Aptana占用了很多资源,所以在打开的时候减慢了其他进程,有点像time.sleep的效果??)
非常感谢任何指点。
1 个回答
1
我不明白你为什么要每次网络读取时都去打开和关闭文件。正如Pavel所说,这样可能会让病毒扫描器有机会打开(并锁定?)这个文件进行扫描。为什么不一次性打开文件,完成所有的输入输出操作后再关闭呢?(我想这可能和你省略的代码有关。)
而不是:
while True:
data = web_page.read(8192)
if not data:
print "done"
break
with open(file_name, "ab") as outputFile:
outputFile.write(data)
试试:
with open(file_name, "ab") as outputFile:
while True:
data = web_page.read(8192)
if not data:
print "done"
break
outputFile.write(data)