Python ftps.storlines socket.timeout,尽管文件上载已完成

Python ftps.storlines socket.timeout,尽管文件上载已完成,python,upload,timeout,ftplib,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

我正在尝试使用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
但是在超时之后,我通过Cyberduck检查目录,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()似乎有问题,可能正在等待最终读取,但internet似乎没有提供解决方案


有人能解释一下吗?

我能够通过覆盖来克服这个问题

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()

您在
.close()
之前是否尝试过
ftps.quit()
?您可以将
与FTP一起使用。。。作为ftps:…
而不是手动调用
退出
关闭
。这里似乎不需要
auth()
,您可以交换
prot_p()
(加密数据层)和
login()
(必要时可以调用
auth()
)。谢谢@J.F.Sebastian。我已经更新了上面的代码以反映您的更改,这些更改使代码更加清晰,但是问题发生在ftps.storlines中。ftplib.py中的storlines方法调用ssl.py中的conn.unwrap(),这似乎就是问题的症结所在。我可以使用ftplib.py的自定义副本,并将conn.unwrap()行更改为conn.close(),但它似乎很粗糙。。。你觉得怎么样?我不知道。确保ftplib在这里的使用是正确的(无论是文档、方法的docstring指示它还是rfc中突出的内容)。请尝试其他Python版本、其他ftp客户端(无论是否使用Python)。如果你能找到一个工作客户;跟踪其命令,并查看代码是否生成相同的ftp命令序列(请尝试使用自己的ftp服务器获取调试日志)。尝试将
git bull
归咎于
unwrap()
行,看看它是从哪里来的——以防它是一个bug。作为测试,我刚刚克隆了ftplib.py,并将conn.unwrap()行更改为conn.close(),从表面上看,它似乎优雅地退出,没有留下任何资源打开。。。我要多挖一些。谢谢你的建议和支持。