从FTP下载文件时出现多处理错误

时间:2014-06-26 23:39:59

标签: python ftp multiprocessing

我一直坚持代码的这种特殊美感,我可以弄清楚它为什么不起作用。当我运行下面的代码时,我得到一个酸洗错误,它总是在不同的文件上。

这将下载随机数量的文件,然后神奇地停止。由于某种原因,第i个文件名(或者它选择停止的任何地方)突然变得不可拾取而其他之前的文件名。我可以看到所有中的所有不是可选择的,或者没有一个,但是任意数字不是可选择的,这只是奇怪的。

n=10
urls = ["ftp://ftp.sec.gov/{0:s}".format(f) for f in flist[:n]]
print urls
from multiprocessing import Pool
from urllib import urlretrieve

def download(url):
    try:
        file_name = str(url.split('/')[-1])
        print file_name
        return urlretrieve(url, file_name), None
    except Exception as e:
        return None, e

if __name__ == "__main__":
   p = Pool(10) 
   p.map(download, urls) 

我得到的错误是:

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "/usr/local/lib64/anaconda/lib/python2.7/multiprocessing/pool.py", line 250, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/local/lib64/anaconda/lib/python2.7/multiprocessing/pool.py", line 554, in get
    raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '[(('0000950144-94-000788.txt', <mimetools.Message instance at 0x6333878>), None)]'. Reason: 'PicklingError("Can't pickle <type 'cStringIO.StringI'>: attribute lookup cStringIO.StringI failed",)'

有谁知道为什么第i个元素突然变得不易拾取?而其他人之前呢?我可以看到它是因为它认为第i个名称是一个字符串IO但没有任何意义,因为它之前的那个应该也一样。

1 个答案:

答案 0 :(得分:1)

您将返回表示FTP标头的mimetools.Message对象。要么将其删除,要么在返回之前变成普通的字符串。

以下是后者的一个例子:

n=10
urls = ["ftp://ftp.sec.gov/{0:s}".format(f) for f in flist[:n]]
print urls
from multiprocessing import Pool
from urllib import urlretrieve

def download(url):
    try:
        file_name = str(url.split('/')[-1])
        print file_name
        filename,headers = urlretrieve(url, file_name)
        return (filename, repr(headers), None
    except Exception as e:
        return None, e

if __name__ == "__main__":
   p = Pool(10) 
   p.map(download, urls)