ftps.storlines socket.timeout, несмотря на завершение загрузки файла
Я пытаюсь загрузить CSV-файл, используя ftplib.FTP_TLS, однако независимо от установленного времени ожидания (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(...), но получил ту же ошибку.
Изменить: файл определенно существует, и на самом деле создается на сервере в полном объеме. Похоже, что это проблема с.shutdown() в ssl.py, возможно, ожидающего окончательного чтения, но Интернет, похоже, не дает решения.
Кто-нибудь может пролить свет, пожалуйста?
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()