2013-03-01 70 views
4

我試圖做一個簡單的功能,以下載文件在python 的代碼是一樣的東西下載Python中的文件,並取消

def download(url , dest): 
    urllib.urlretrieve(url, dest) 

我的問題是,如果我想取消在下載過程下載中間如何處理?

此功能在運行應用程序的背景,並通過一個按鈕來觸發。現在我試圖用另一個按鈕觸發它。

該平臺XBMC。

+1

我認爲你必須給我們一個豆蔻有點多了去上。你如何調用這個函數,你使用瀏覽器來做這個,還是你通過shell執行它? – 2013-03-01 13:48:21

+2

@limelights如何在瀏覽器中運行Python代碼? – unwind 2013-03-01 13:48:54

+0

@unwind好,他顯然是缺乏解釋這個問題,所以我相信他有在Django或瓶或瓶是再調用這個函數可能的機會。我只是試圖讓球解釋。另外,他可能會在四處徘徊:P – 2013-03-01 13:50:37

回答

2

一個簡單的類做同樣作爲您download功能:

import urllib 
import threading 

class Downloader: 

    def __init__(self): 
     self.stop_down = False 
     self.thread = None 

    def download(self, url, destination): 
     self.thread = threading.Thread(target=self.__down, args=(url, destination)) 
     self.thread.start() 

    def __down(self, url, dest): 
     _continue = True 
     handler = urllib.urlopen(url) 
     self.fp = open(dest, "w") 
     while not self.stop_down and _continue: 
      data = handler.read(4096) 
      self.fp.write(data) 
      _continue = data 
     handler.close() 
     self.fp.close() 

    def cancel(self): 
     self.stop_down = True 

所以,當有人點擊「取消」按鈕,您可以調用cancel()方法。

請注意,如果您取消這不會刪除部分下載的文件,但不應該是很難達到使用os.unlink(),例如。

以下示例腳本說明如何使用它,開始了〜20MB的文件的下載和取消其在5秒後:

import time 
if __name__ == "__main__": 
    url = "http://ftp.postgresql.org/pub/source/v9.2.3/postgresql-9.2.3.tar.gz" 
    down = Downloader() 
    down.download(url, "file") 
    print "Download started..." 
    time.sleep(5) 
    down.cancel() 
    print "Download canceled" 
0

如果您通過按CTRL + C取消,那麼你可以使用這是內置的例外,並繼續你認爲最好的舉措應該是。

在這種情況下,如果我在下載過程中取消,我只是希望那部分文件被刪除:

def download(url , dest): 
    try: 
     urllib.urlretrieve(url, dest) 
    except KeyboardInterrupt: 
     if os.path.exists(dest): 
      os.remove(dest) 
    except Exception, e: 
     raise