ftps.storlines socket.timeout尽管文件上传完成

时间:2015-02-18 15:26:18

标签: python upload timeout ftplib

我尝试使用ftplib.FTP_TLS上传CSV文件,但无论我设置的超时时间(5,10,60秒)如何,代码总是超时并出现错误:

File "/usr/lib/python3.4/ftplib.py", line 544, in storlines
  conn.unwrap()
File "/usr/lib/python3.4/ssl.py", line 788, in unwrap
  s = self._sslobj.shutdown()
socket.timeout: The read operation timed out

然而,在超时后,我通过Cyber​​duck检查目录,并且CSV文件在那里,完成。

这是我的上传代码:

def upload_csv(filename):
    with FTP_TLS(timeout=5) as ftps:
        ftps.set_pasv(True)
        ftps.connect(ftps_server,ftps_port)
        ftps.login(ftps_username, ftps_password)
        ftps.prot_p()
        ftps.cwd('sales')
        ftps.storlines("STOR " + filename, open(filename,'rb'))

我也试过storbinary(...)但得到同样的错误。

编辑: 该文件肯定存在,并且实际上完全在服务器上创建。看起来ssl.py中的.shutdown()问题可能等待最终阅读,但互联网似乎无法提供解决方案。

有人可以放任何光吗?

1 个答案:

答案 0 :(得分:0)

我能够通过覆盖克服问题

ftplib._SSLSocket = None

这里有一个更完整的示例:

def transfer_zip(dest_zipfile, host, host_path, user, password):
    os.chdir(dirname(dest_zipfile))
    with ftplib.FTP_TLS(host, timeout=10) as ftp:
        ftp.login(user, password)
        ftp.prot_p()
        ftp.cwd(host_path)
        ftplib._SSLSocket = None
        ftp.storbinary(f"STOR {basename(dest_zipfile)}", open(dest_zipfile, 'rb'))
        ftp.quit()
        ftp.close()