2017-01-11 12 views
1

に「操作がタイムアウトしました」で失敗します。暗黙的FTPSは、私は、次の取得暗黙的FTPS経由ShareFileへの接続を行うためにはPythonを使用した場合の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',) 

マイtyFTP暗黙的FTPSは、直接ではないので(必要ftplibでサポートされています)クラスはここから来ます:Python FTP implicit TLS connection issue。コードは次のとおりです。

ftps = tyFTP() 
try: 
    ftps.connect(‘ftps.host.domain’, 990) 
except: 
    traceback.print_exc() 
    traceback.print_stack() 
ftps.login(‘uid', ‘pwd') 
ftps.prot_p() 

try: 
    ftps.storbinary("STOR /file", open(file, "rb"), 1024) 
    # i also tried non-binary, but that didn't work either 
    # ftps.storlines("STOR /file", open(file, "r")) 
except: 
    traceback.print_exc() 
    traceback.print_stack() 

この質問は以前に聞かれましたが、唯一提供される解決策は、Pythonコードをハックすることです。それは最高の/唯一のオプションですか? http://bugs.python.org/issue8108

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

ftps.storlines socket.timeout despite file upload completing

python.orgでこの問題についての古い議論もあり

ShareFile upload with Python 2.7.5 code timesout on FTPS STOR

注:私は既存の質問にコメントを追加しましたが、私の評判はコメントできないほど高かった(新しいスタック交換ユーザー)。

答えて

1

あなたが必要とするヘルプは、あなた自身のものです。

ftplibコード(/ System/Libraryにファイルを簡単に書き込めない/変更できないため、Mac上でジャンプする必要があります)を直接修正することなくこれを修正するには、ftplib.FTP_TLSのstorbinaryメソッドをオーバーライドします。

Python FTP implicit TLS connection issue

をして、クラスtyFTPにこれらの行を追加し、そしてconn.unwrap()の呼び出しをコメントアウトし、「パス」に置き換えること:それは、本質的に、暗黙的FTPSをサポートするため、この修正プログラムを使用しています

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() 
関連する問題