Ich versuche, ein ganzes FTP-Verzeichnis parallel zu laden.Python Multiprocessing: TypeError: erwartete Zeichenfolge oder Unicode-Objekt, NoneType gefunden
#!/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()
Aber ich bekomme diese Ausnahme:
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
Wenn ich diese Zeile aus kommentieren:
pool.apply_async(downloadFile, (filename,local_filename,ftp)
und entfernen Sie den Kommentar zu dieser Zeile:
downloadFile(filename,local_filename,ftp);
Dann es funktioniert gut, aber es ist langsam und nicht Multithread.
Dieser Code läuft nicht wie geschrieben (es gibt Variablennamenfehler in 'downloadFiles'). Können Sie Arbeitscode posten und einen Beispielaufruf von 'downloadFiles' zeigen, der das Problem demonstriert? –
In Ordnung - ich habe meinen Beitrag überarbeitet. –
versuchen: 'aus multiprocessing.dummy Import Pool ', die Threads anstelle von Prozessen als schnelle Abhilfe verwendet, wenn es funktioniert, dann könnte das Problem in der Initialisierung sein/einige Objekte wie ftp an untergeordnete Prozesse übergeben. Wickeln Sie 'downloadFile()' body in 'try/except' Block, um Ausnahmen zu protokollieren, falls diese Version von' multiprocessing' diese fälschlicherweise meldet. – jfs