用Python下载文件并取消下载

5
我正在尝试编写一个简单的 Python 函数来下载文件。 代码如下:
def download(url , dest):
    urllib.urlretrieve(url, dest)

我的问题是,如果我想在下载过程中取消下载,该怎么办?

这个功能在应用程序的后台运行,并由一个按钮触发。现在我正在尝试使用另一个按钮来触发它。

平台是XBMC。


1
我觉得你需要给我们更多信息。你是怎么调用那个函数的?你是在浏览器中执行还是通过命令行执行? - Henrik Andersson
2
@limelights 你如何在浏览器中运行Python代码? - unwind
@unwind 嗯,显然他在解释这个问题方面有所欠缺,因此我认为他很可能是在Django或Flask或Bottle中调用了这个函数。我只是想让解释的球滚起来。另外,他可能正在skulpt中胡闹:P - Henrik Andersson
3
你可以通过在键盘上按 CTRL+C 来简单取消程序本身;但是,如果你想要更复杂的操作,就需要提供有关如何运行代码的更多细节。 - Burhan Khalid
我正在xbmc内运行该应用程序。 - Abul Hasnat
2个回答

3
一个简单的类,可以做与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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接