ftplib - 文件创建非常慢:SSLError:读取操作超时

时间:2015-08-06 09:30:25

标签: python file ftp timeout ftplib

import ftplib
import csv
import StringIO

sio = StringIO.StringIO()
data = csv.writer(sio)
data.writerows(data_to_export)
sio.seek(0)
ftps.storbinary("STOR " + 'blah.csv', sio)
ftps.close()

因此,我创建的文件只有56行,创建速度非常慢。当它完成创建时,我收到此错误:

    ftps.storbinary("STOR " + 'blah.csv', sio)
  File "/usr/lib/python2.7/ftplib.py", line 752, in storbinary
    conn.unwrap()
  File "/usr/lib/python2.7/ssl.py", line 384, in unwrap
    s = self._sslobj.shutdown()
SSLError: The read operation timed out

我不明白为什么它如此缓慢以及为什么它会给出时间,即使它会创建该文件。

P.S。请询问我是否需要提供其他信息

更新 我也尝试了cString,但它没有改进任何东西,因为我猜它与写入速度无关。

如果存在任何差异,则使用隐式SSL / TLS模式(ftp不支持显式SSL / TLS)建立与ftp的连接。

更新 深层发掘。这就是调试显示的ftp:

*cmd* 'TYPE I'
*resp* '200 Binary mode selected.'
*cmd* 'PASV'
*resp* '227 Entering Passive Mode (*,*,*,*,*,*)'
*cmd* 'STOR blah.csv'
*resp* '125 Secure data connection open; transfer starting.'

然后卡在最后一个输出上,直到我连接超时。

注意即可。我的互联网连接非常好,但是ftp有点慢。我仍然认为这样的小文件处理速度要快得多。

UPDATE2 这是一些奇怪的ftp。尝试不安全的ftp连接,文件正确且快速上传。隐式连接与这种缓慢的性能和超时有关。

1 个答案:

答案 0 :(得分:0)

关于速度,有太多的因素无法猜测,所以我会调整代码并尝试以下代码,我最近为客户ftp交付创建并且可以说它没有错误。

请注意,这是来自一个更大的文件,但已提取相关部分,因此忽略一些变量,即args.var,您可能必须根据带宽调整块大小等尝试将其降低到1024然后处理。< / p>

希望有所帮助

def initiate_ftp_connection(ftp_host, user, passwd, ftp_dir):
    ftp_session = ftplib.FTP()
    ftp_session.connect(ftp_host, 21)
    #uncomment for debugging.
    #ftp_session.set_debuglevel(2)
    ftp_session.login(user=user, 
                      passwd=passwd)
    #cd to correct remote directory
    ftp_session.cwd(ftp_dir)
    return ftp_session



def upload_deliverables(session, file_and_path):
    working_dir = os.path.dirname(file_and_path)
    #strip to remove any newlines
    filename = os.path.basename(file_and_path).strip()
    totalSize = os.path.getsize(file_and_path)
    #instantiate progress tracker for status updates
    uploadTracker = FtpUploadTracker(int(totalSize),filename)
    #change dir to working_dir
    os.chdir(working_dir)
    '''
     Trigger the ftp upload (storbinary) for the deliverable.
      Args:
       1: FTP KEYWORD and FILE
       2: File IO
       3: Blocksize
       4: Callback
    '''
    session.storbinary('STOR ' + filename, 
                        open(filename,'r'), 
                        8192, 
                        uploadTracker.ftp_callback)


#connect to server
ftp_session = initiate_ftp_connection(args.ftp_host, 
                                      args.ftp_user, 
                                      args.ftp_pass,
                                      args.ftp_dir)

#start ftp delivery
upload_deliverables(ftp_session, args.asset)
#quit the ftp session
ftp_session.quit()   
#close any file handles.
ftp_session.close()