Python的ftplib STOR可靠吗?

时间:2010-01-13 16:57:05

标签: python exception ftp file-upload ftplib

我正在使用此代码将myfile.txt从我的Windows机器上传到ftp服务器。在upoad之后脚本删除我本地计算机上的文件(我不会在ftp上删除它)。

try:
    ftp = FTP(ftp.host.com)
    ftp.login(your_username, your_password)
    file = open(myfile.txt, "rb")
    ftp.storbinary('STOR myfile.txt', file)
    print 'STORing File now...'
    ftp.quit()
    file.close()
    subprocess.Popen('del myfile.txt', shell=True)
    print 'File deleted'
except all_errors:
    print 'An error occured'

此代码运行,但它不可靠!在每次上传〜第10次上传时,我的脚本会在存储文件时挂起。

print 'STORing File now...' # So I just get 'STORING File now...'

文件不大,应该在几秒钟内上传,但我经常需要等待一两个小时才会抛出异常:

print 'An error occured'

如果异常被“更早”抛出,那就太好了,所以我可以重新启动上传(例如在while循环中)。因为我需要尽快上传这个文件,所以我需要更快地上传文件(我不想等待很长时间才能抛出异常)

第二个问题:有时会发生这种情况:文件成功上传后,脚本无法删除本地计算机上的文件,因为“其他一些进程已经访问它了”< - 我认为ftplib没有'发布'文件。我该怎么做才能防止这种情况发生?

我正在寻找更好/可靠的简单文件上载解决方案。有人有想法吗? 谢谢!

3 个答案:

答案 0 :(得分:2)

不要使用子进程来删除文件 - os.unlink调用将允许你可移植地执行此操作(当os失败时,shutil库填补空白)

现在,您正在使用愚蠢的打印声明来处理错误 - 从异常中获取回溯,这将为您提供大量线索。但是,您的问题可能与套接字超时问题有关 - 要么您没有运行被动FTP,要么服务器配置错误并且给出了无效的被动连接端口号(防火墙阻塞)。

答案 1 :(得分:2)

这个怎么样

def upload(ftp, filename):
    ftp.storbinary("STOR " + filename, open(filename, "rb"), 1024)
try:
    ftp = FTP("ftp.host.com")
    ftp.login(your_username, your_password)
except Exception,e:
    print e
else:
    file = open("myfile.txt", "rb")
    print 'STORing File now...'
    try:
        upload(ftp,file)
    except Exception,e:
        print e
    else:
        ftp.quit()
        file.close()
        try:
            os.remove("myfile.txt")
        except Exception,e:
            print e
        else:
            print 'File deleted'

记住,Python有自己的文件删除模块。不要不必要地调用system del

答案 2 :(得分:1)

要提前获取例外,请使用socket.setdefaulttimeout:例如,

import socket
socket.setdefaulttimeout(20.0)
如果套接字被阻止了20秒,

会给你一个例外。

要从Pyton脚本中删除文件,请使用os.unlink - 要比针对del的单独进程更好。