我試圖做一個簡單的功能,以下載文件在python 的代碼是一樣的東西下載Python中的文件,並取消
def download(url , dest):
urllib.urlretrieve(url, dest)
我的問題是,如果我想取消在下載過程下載中間如何處理?
此功能在運行應用程序的背景,並通過一個按鈕來觸發。現在我試圖用另一個按鈕觸發它。
該平臺XBMC。
我試圖做一個簡單的功能,以下載文件在python 的代碼是一樣的東西下載Python中的文件,並取消
def download(url , dest):
urllib.urlretrieve(url, dest)
我的問題是,如果我想取消在下載過程下載中間如何處理?
此功能在運行應用程序的背景,並通過一個按鈕來觸發。現在我試圖用另一個按鈕觸發它。
該平臺XBMC。
一個簡單的類做同樣作爲您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"
如果您通過按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
我認爲你必須給我們一個豆蔻有點多了去上。你如何調用這個函數,你使用瀏覽器來做這個,還是你通過shell執行它? – 2013-03-01 13:48:21
@limelights如何在瀏覽器中運行Python代碼? – unwind 2013-03-01 13:48:54
@unwind好,他顯然是缺乏解釋這個問題,所以我相信他有在Django或瓶或瓶是再調用這個函數可能的機會。我只是試圖讓球解釋。另外,他可能會在四處徘徊:P – 2013-03-01 13:50:37