我有一個遠程文件位置和本地路徑的大列表,我希望它們最終結束。每個文件都很小,但其中有很多。我在Python中生成這個列表。並行下載多個文件? (Linux/Python?)
我想在開箱和處理它們之前儘快(並行)下載所有這些文件。什麼是最好的庫或Linux命令行工具供我使用?我試圖用multiprocessing.pool來實現這個功能,但是這並不適用於FTP庫。
我看着pycurl,這似乎是我想要的,但我無法讓它在Windows 7 x64上運行。
我有一個遠程文件位置和本地路徑的大列表,我希望它們最終結束。每個文件都很小,但其中有很多。我在Python中生成這個列表。並行下載多個文件? (Linux/Python?)
我想在開箱和處理它們之前儘快(並行)下載所有這些文件。什麼是最好的庫或Linux命令行工具供我使用?我試圖用multiprocessing.pool來實現這個功能,但是這並不適用於FTP庫。
我看着pycurl,這似乎是我想要的,但我無法讓它在Windows 7 x64上運行。
我通常使用pscp
做這樣的事情,然後用subprocess.Popen
例如叫它:
pscp_command = '''"c:\program files\putty\pscp.exe" -pw <pwd> -p -scp -unsafe <file location on my linux machine including machine name and login, can use wildcards here> <where you want the files to go on a windows machine>'''
p = subprocess.Popen(pscp_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
p.wait()
當然
我假設的linux - >窗口
如果請使用multiprocessing
模塊中的Pool
對象,urllib2
應處理FTP。
results = {}
def get_url(url):
try:
res = urllib2.urlopen(url)
# url should start with 'ftp:'
results[url] = res.read()
except Exception:
# add more meaningful exception handling if you need it. Eg, retry once etc.
results[url] = None
pool = Pool(processes=num_processes)
result = pool.map_async(get_url, url_list)
pool.close()
pool.join()
當然,產卵過程會產生一些嚴重的開銷。如果您可以使用第三方模塊(如twisted
),則非阻塞請求幾乎肯定會更快。開銷是否是嚴重問題取決於每個文件的下載時間和網絡延遲的相對大小。
您可以嘗試使用python線程而不是進程來實現它,但它有點棘手。請參閱this question的回答以安全地使用線程來使用urllib2。你也需要使用multiprocessing.pool.ThreadPool
而不是常規的Pool
知道這是一箇舊的帖子,但有一個完美的Linux實用程序。如果您從遠程主機傳輸文件,lftp
太棒了!我主要使用它來快速將東西推送到我的ftp服務器,但它使用mirror
命令也可以很好地解決問題。它還有一個選項,可以像您想要的那樣並行複製用戶定義的文件數量。如果你想從遠程路徑複製一些文件到本地路徑,你的命令行看起來就像這樣;
lftp
open ftp://user:[email protected]
cd some/remote/path
lcd some/local/path
mirror --reverse --parallel=2
儘管這個命令要非常小心,就像其他鏡像命令一樣,如果你搞砸了,你會刪除文件。
更多選項或文檔lftp
我訪問過該網站http://lftp.yar.ru/lftp-man.html
你的問題說你使用Linux,但你提到的Windows 7,這樣的平臺,你實際使用,或者你需要一個跨平臺解決方案? – Aya 2013-04-25 16:07:37
ftplib有什麼問題? – tdelaney 2013-04-25 16:29:41