मैं समांतर में एक संपूर्ण ftp निर्देशिका डाउनलोड करने का प्रयास कर रहा हूं।पायथन मल्टीप्रोसेसिंग: टाइप एरर: अपेक्षित स्ट्रिंग या यूनिकोड ऑब्जेक्ट, कोई नहीं टाइप
#!/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);
यह ठीक काम करता है लेकिन यह धीमा है और नहीं बहु-क्रम।
यह कोड लिखित के रूप में नहीं चलाया जाता है ('डाउनलोडफाइल' में परिवर्तनीय नाम त्रुटियां हैं)। क्या आप वर्किंग कोड पोस्ट कर सकते हैं और 'डाउनलोडफाइल' का नमूना कॉल दिखा सकते हैं जो समस्या का प्रदर्शन करता है? –
ठीक है - मैंने अपनी पोस्ट संशोधित की। –
आज़माएं: 'multiprocessing.dummy आयात पूल' से जो प्रक्रियाओं के बजाय थ्रेड का उपयोग त्वरित कार्यवाही के रूप में करता है, यदि यह काम करता है तो समस्या कुछ ऑब्जेक्ट्स प्रारंभ/पास करने में हो सकती है जैसे कि बच्चे प्रक्रियाओं के लिए 'ftp'। 'मल्टीप्रोसेसिंग' के इस संस्करण को गलत तरीके से रिपोर्ट करने के मामले में अपवाद लॉग करने के लिए 'कोशिश/छोड़कर' ब्लॉक में 'डाउनलोडफाइल() 'निकाय को लपेटें। – jfs