我正在尝试编写一个简单的 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"
def download(url , dest):
try:
urllib.urlretrieve(url, dest)
except KeyboardInterrupt:
if os.path.exists(dest):
os.remove(dest)
except Exception, e:
raise
CTRL+C
来简单取消程序本身;但是,如果你想要更复杂的操作,就需要提供有关如何运行代码的更多细节。 - Burhan Khalid