2013-01-23 53 views
1

因此,我正在編寫一個腳本來下載文件,並在文件沒有完成時從其停止的地方重新開始下載。這部分照顧。權限在下載可執行文件時有時會被拒絕

我拿出所有這些部分出來只顯示不工作的部分。亞馬遜網址在這裏,我只是做了,所以它實際上不會下載任何東西,如果你運行它,但實際的下載鏈接更換網址,會:

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和20ish之間),然後拋出IOError:13,Permission denied。同樣,使用.gif或.mov或我測試過的其他一些東西,拒絕錯誤的權限永遠不會拋出。

此外,取消註釋time.sleep(1)行可以解決問題。就好像with語句在繼續之前沒有完全關閉文件。

我以爲有聲明應該處理關閉,不是嗎?

我也認爲我的目前目錄正在改變,但取消註釋,從來沒有透露它(儘管通過相同的邏輯,它不一定必須)。

(奇怪的是,如果我在桌面上打開Aptana時從桌面運行此腳本(以便它也寫入桌面),拒絕權限錯誤將不會發生,但第二次我將文本編輯器專注於桌面,錯誤拋出 - 我將此歸因於Aptana在打開時佔用大量資源,因此減慢了另一個進程並且有點像time.sleep ??)

非常感謝任何指針。

+0

可能是防病毒鬼混。 –

+0

聽起來像Windows上的UAC,非管理級別的腳本不能產生需要管理員私有的進程 –

+0

也'非常感謝任何指針.'這裏有一些0x005556c –

回答

1

我不明白爲什麼你要麻煩重新打開和關閉每個網絡讀取文件。正如Pavel所建議的那樣,這可能會讓病毒掃描器有機會打開(並鎖定?)文件以對其進行掃描。爲什麼不打開它一次,做所有的I/O,然後關閉它? (我想這可能是與你省略了代碼。)

相反的:

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) 
+0

我希望我知道什麼是導致文件阻止 - 我試過殺死所有已知的AV。無論如何,這可能是更好的做事方式。編輯:我會upvote,但需要15聲望:P –