FTP代码的问题

FTP代码的问题

前些日子我写了个自动备份并FTP上传到指定服务器的程序,经过一段时间试用,发现有一个奇怪的问题,程序在FTP上传后一直卡在那里不进入下一步,而我在FTP SERVER上看到上传已经成功,链接断开了。
怪异的是并不是每次都是这样的,我在多台服务器上部署有时候今天这台,有时假明天另一台,没有什么大的规律,似乎程序FTP上传的文件越大,发生这个情况的可能性越高。手工运行了几次,都是正常的,不知何解?
是否FTP模块会有什么问题的呢?

程序FTP的部分代码如下(import等部分不含的):

[Copy to clipboard] [ - ]
CODE:
def ftpstor(ftpfile):

    ftp=ftplib.FTP()
    try:
        ftp.connect(ftp_addr,ftp_port)
        ftp.set_pasv(True)
        ftp.login(ftp_user,ftp_pwd)
        print ftp.getwelcome()
        ftp.cwd(ftp_path)
        f = open(ftpfile,'rb')
        print getfilename(ftpfile)," uploading..."
        ftp.storbinary("STOR %s "% getfilename(f.name) ,f,bufsize)      #上传文件
        print getfilename(ftpfile)," upload completed."
        ftp.close()
        f.close()                                                       #关闭文件
        ftp.quit()
    except:
        info=sys.exc_info()
        path=os.path.join(workdir,errlogfile)
        traceback.print_exc(file=open(path,"a"))

def main():
    for dbname in dbnamelist:
        print "-----------------------------------------------"
        ftpfilename=os.path.join(workdir,dbname+"_"+nowdate+".rar")
        print ftpfilename," FTP session starting..."
        ftpstor(ftpfilename)
        print ftpfilename," FTP session completed."
        print "-----------------------------------------------"
main()

程序就卡在ftpstor(ftpfilename)这一块,也不知道具体是哪一步有问题了。
另,我用py2exe生成exe来用的。

会不会是连接空闲时间到了被server踢掉了?
不会的,我在FTP服务端看了日志,文件是正常传完,然后closed,但是这时我的程序没有正常继续下去。
我准备改下程序,增加打印LOG,然后再找问题在哪里。
跟了一下LOG
发现问题定位就是在FTP上传这一块
ftp.storbinary("STOR %s "% getfilename(f.name) ,f,bufsize)      #上传文件
从LOG上看,这一句始终没有结束,导致后续程序无法继续进行下去。

FTP服务端我已经把TIMEOUT设为几个小时,所以应该不会再有这个问题。

这个程序我在几个程序上使用,一个FTP文件只有6M的正确运行完毕了,而大于350M,1G的,2G的几个都没有正常运行下去?
是不是BUFSIZE的问题?可是在FTP服务器上不管是6M的还是2G的,都是上传正常结束的,而且文件也是好用的。

怪异的问题,没有解决方案,现在变成天天要手工上去杀进程,哎。
FTP的client要适应server端才行呀,为了开放client改SERVER设置那搞笑了,我也是卡在这里,郁闷,难道PYTHON的FTP就这样烂吗
基本上找到原因所在了,pasv模式的问题,改成pasv(0)就没问题了。昨天晚上试过没问题,今天把所有程序都改掉了,看明天怎么样。

不过的确很怪异,我来回看了几十遍代码,网上怎么也找不到解决方案,又去研究端口和防火墙,想来想去可能和这个有关,就试着改了下。
明天看最后成败了,应该95%成功了。
pasv模式服务器随机返回一个端口,理论上要求服务器端防火墙允许所有入站请求,但是一般服务器不会这样设置。如果是server端防火墙原因,应该是连不上才对,应该不会出现跟文件大小有关的现象。

哎,昨天试了,发现其实没解决。改为pasv(0)了后,根本没传上去。
我快给他烦死了,决定用王道了。

既然小文件上传什么问题都没有,那么我计划重写程序,把2G的大文件打包成10M一个小文件,然后一个个传,我就不信活人能给程序憋死。
bufsize设的是多少?怎么没看到设置?
bufsize设的是1024,我定义为全局的,所以在def没有。