2013-03-01 73 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