我试图做一个简单的功能,以下载文件在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