2010-08-23 60 views
2

在我的程序中,我需要同時下載3-4個文件(來自不同的服務器,這些服務器很慢)。我意識到涉及python線程或qt線程的解決方案,但我想知道:因爲它似乎是一個相當普遍的任務,也許有一個庫,我提供的URL和簡單地接收文件? 在此先感謝!在python和qt下同時下載文件

回答

7

是的,有一個 - pycurl。

它不是'簡單'的,因爲curl是低級的,但它完全符合你的需求 - 你爲它提供一些URL,然後它同時並且異步地下載。

import pycurl 
from StringIO import StringIO 

def LoadMulti(urls): 
    m = pycurl.CurlMulti() 
    handles = {} 
    for url in urls: 
     c = pycurl.Curl() 
     c.setopt(pycurl.URL, url) 
     data = StringIO() 
     header = StringIO() 
     c.setopt(pycurl.WRITEFUNCTION, data.write) 
     c.setopt(pycurl.HEADERFUNCTION, header.write)     
     handles[url] = dict(data=data, header=header, handle=c) 
     m.add_handle(c) 
    while 1: 
     ret, num_handles = m.perform() 
     if ret != pycurl.E_CALL_MULTI_PERFORM: break 
    while num_handles: 
     ret = m.select(1.0) 
     if ret == -1: continue 
     while 1: 
      ret, num_handles = m.perform() 
      if ret != pycurl.E_CALL_MULTI_PERFORM: break 
    return handles 


res = LoadMulti(['http://pycurl.sourceforge.net/doc/pycurl.html', 'http://pycurl.sourceforge.net/doc/curlobject.html', 'http://pycurl.sourceforge.net/doc/curlmultiobject.html']) 
for url, d in res.iteritems(): 
    print url, d['handle'].getinfo(pycurl.HTTP_CODE), len(d['data'].getvalue()), len(d['header'].getvalue()) 

您可以在這些while循環中運行GUI更新,因此接口不會凍結。

+0

真棒答案,謝謝! – Tom 2010-08-23 11:41:13