2017-01-11 5 views
1

Wenn Python eine Verbindung zu Sharefile über implizite FTPS machen ich folgendes erhalten:Implizite FTPS auf Sharefile schlägt mit „Operation timed out“ in Python

Traceback (most recent call last): 
    ftps.storbinary("STOR /file, open(file, "rb"), 1024) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 769, in storbinary 
conn.unwrap() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 791, in unwrap 
    s = self._sslobj.shutdown() 
SSLError: ('The read operation timed out',) 

Mein tyFTP (erforderlich, da implizite FTPS nicht direkt ist unterstützt in ftplib) Klasse kommt von hier: Python FTP implicit TLS connection issue. Hier ist der Code:

Diese Frage wurde zuvor gestellt, aber die einzige Lösung ist, den Python-Code zu hacken. Ist das die beste/einzige Option?

ShareFile upload with Python 2.7.5 code timesout on FTPS STOR

ftplib - file creation very slow: SSLError: The read operation timed out

ftps.storlines socket.timeout despite file upload completing

Es gibt auch eine alte Diskussion über dieses Thema auf python.org: http://bugs.python.org/issue8108. Der Vorschlag dort ist, dass dies eine mehrdeutige Situation ist, die schwer zu beheben ist (und vielleicht nie war?)

Bitte beachten Sie: Ich hätte Kommentare zu den vorhandenen Fragen hinzugefügt, aber mein Ruf war nicht hoch genug, um zu kommentieren (neuer Stapel Benutzer austauschen).

Antwort

1

manchmal ist die Hilfe, die Sie brauchen, Ihre eigene.

Um dies zu beheben, ohne den ftplib-Code direkt zu modifizieren (was das Springen durch einen Mac erfordert, weil Sie Dateien in Ihrem/System/Library nicht einfach schreiben/ändern können) überschreibe ich die storbinary-Methode in ftplib.FTP_TLS. Das wird im Wesentlichen unter Verwendung dieses Update unterstützt impliziten FTPS-:

Python FTP implicit TLS connection issue

und Hinzufügen dann diese Zeilen zu der Klasse tyFTP und die conn.unwrap() -Aufruf Kommentierung aus und ersetzt sie durch ‚Pass‘:

def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None): 
    self.voidcmd('TYPE I') 
    conn = self.transfercmd(cmd, rest) 
    try: 
     while 1: 
     buf = fp.read(blocksize) 
     if not buf: break 
     conn.sendall(buf) 
     if callback: callback(buf) 
     if isinstance(conn, ssl.SSLSocket): 
     pass 
#   conn.unwrap() 
    finally: 
     conn.close() 
    return self.voidresp() 
Verwandte Themen