python 输入字符串 堆栈溢出检查_Python多处理:TypeError:预期的字符串或Unicode对象,找到NoneType...

在尝试使用Python的multiprocessing库并行下载FTP目录时,遇到TypeError异常,原因是传递给子进程的参数中包含了None。通过注释掉多线程部分并直接调用函数可以避免错误,但会导致下载速度变慢。问题在于`ftp`对象没有正确传递到子进程中。
摘要由CSDN通过智能技术生成

我正在尝试并行下载一个完整的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);

然后它工作得很好,但它是缓慢而不是多线程.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值