下载python中的文件并取消

下载python中的文件并取消,python,download,Python,Download,我试图用python制作一个简单的函数来下载文件 代码类似于 def download(url , dest): urllib.urlretrieve(url, dest) 我的问题是,如果我想在下载过程中取消下载过程,我该怎么办??? 此功能在应用程序的后台运行,由按钮触发。现在我正试图用另一个按钮来触发它 该平台是XBMC。一个简单的类,可以实现与您的下载功能相同的功能: import urllib import threading class Downloader:

我试图用python制作一个简单的函数来下载文件 代码类似于

def download(url , dest):
    urllib.urlretrieve(url, dest)
我的问题是,如果我想在下载过程中取消下载过程,我该怎么办??? 此功能在应用程序的后台运行,由按钮触发。现在我正试图用另一个按钮来触发它


该平台是XBMC。

一个简单的类,可以实现与您的
下载功能相同的功能:

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执行此操作?@limelights您将如何在浏览器中运行Python代码?@unwind好吧,显然他没有解释此问题,因此我相信他很有可能在Django或Flask或Baggle中,然后调用此函数。我只是想让解释顺利进行。此外,他可能在skulpt中四处游荡:PYou只需点击键盘上的
CTRL+C
,即可取消程序本身;但是如果你想要更复杂的东西,你需要提供更多关于如何运行代码的细节