5

Pythonでファイルをダウンロードする簡単な関数を作成しようとしていますコードは次のようなものです

def download(url , dest):
    urllib.urlretrieve(url, dest)

私の問題は、ダウンロードの途中でダウンロードプロセスをキャンセルしたい場合、どのようにアプローチすればよいですか?

この関数はアプリのバックグラウンドで実行され、ボタンによってトリガーされます。今、私は別のボタンでそれをトリガーしようとしています。

プラットフォームはXBMCです。

4

2 に答える 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"
于 2013-03-01T22:00:41.723 に答える
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
于 2013-03-01T22:19:11.130 に答える