1

我正在使用此代码将 myfile.txt 从我的 Windows 机器上传到 ftp 服务器。上传后,脚本会删除我本地机器上的文件(我没有在 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 没有“释放”文件。我能做些什么来防止这种情况发生?

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

4

3 回答 3

2

不要使用子进程来删除文件 - os.unlink 调用将允许您以便携方式执行此操作(当 os 失败时,shutil 库填补了空白)

现在,您正在用愚蠢的打印语句吞噬错误 - 从异常中获取回溯,这将为您提供大量线索。但是,您的问题可能与套接字超时问题有关 - 您没有运行被动 FTP,或者服务器配置错误并为您提供了无效的被动连接端口号(它的防火墙阻止了某些东西)。

于 2010-01-13T17:04:00.317 回答
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

于 2010-01-13T17:07:04.663 回答
1

要更早地获取异常,请使用socket.setdefaulttimeout:例如,

import socket
socket.setdefaulttimeout(20.0)

如果一个套接字阻塞了 20 秒,它会给你一个例外。

要从 Pyton 脚本中删除文件,请使用os.unlink - 比将del.

于 2010-01-13T17:01:43.597 回答