我正在使用此代码将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没有'发布'文件。我该怎么做才能防止这种情况发生?
我正在寻找更好/可靠的简单文件上载解决方案。有人有想法吗? 谢谢!
答案 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
的单独进程更好。