ftpディレクトリ全体を並行してダウンロードしようとしています。Pythonマルチプロセッシング:TypeError:予期される文字列またはUnicodeオブジェクト、NoneTypeが見つかりました
#!/usr/bin/python
import sys
import datetime
import os
from multiprocessing import Process, Pool
from ftplib import FTP
curYear=""
remotePath =""
localPath = ""
def downloadFiles (remotePath,localPath):
splitted = remotePath.split('/');
host= splitted[2]
path='/'+'/'.join(splitted[3:])
ftp = FTP(host)
ftp.login()
ftp.cwd(path)
filenames = ftp.nlst()
total=len(filenames)
i=0
pool = Pool()
for filename in filenames:
local_filename = os.path.join(localPath,filename)
pool.apply_async(downloadFile, (filename,local_filename,ftp))
#downloadFile(filename,local_filename,ftp);
i=i+1
pool.close()
pool.join()
ftp.close()
def downloadFile(filename,local_filename,ftp):
file = open(local_filename, 'wb')
ftp.retrbinary('RETR '+ filename, file.write)
file.close()
def getYearFromArgs():
if len(sys.argv) >= 2 and sys.argv[1] == "Y":
year = sys.argv[2]
del sys.argv[1:2]
else:
year = str(datetime.datetime.now().year)
return year
def assignGlobals():
global p
global remotePath
global localPath
global URL
global host
global user
global password
global sqldb
remotePath = 'ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/isd-lite/%s/' % (curYear)
localPath = '/home/isd-lite/%s/' % (curYear)
def main():
global curYear
curYear=getYearFromArgs()
assignGlobals()
downloadFiles(remotePath,localPath)
if __name__ == "__main__":
main()
しかし、私はこの例外を取得:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
put(task)
TypeError: expected string or Unicode object, NoneType found
私は、この行コメントアウトした場合:
pool.apply_async(downloadFile, (filename,local_filename,ftp)
をし、この行のコメント削除:次に
downloadFile(filename,local_filename,ftp);
をそれはうまく動作しますが、それは遅くていないマルチスレッド化。
このコードは書かれたとおりに動作しません( 'downloadFiles'には変数名のエラーがあります)。作業コードを投稿し、問題を示す 'downloadFiles'のサンプルコールを表示できますか? –
申し訳ありません - 私は自分の投稿を改訂しました。 –
try: 'from multiprocessing.dummy import Pool'。プロセスの代わりにスレッドを使用します。問題が初期化されているか、いくつかのオブジェクト、例えば' ftp'を子プロセスに渡している可能性があります。 'multiprocessing'のこのバージョンが間違って報告する場合に例外を記録する' try/except'ブロックに 'downloadFile()'本文をラップしてください。 – jfs