不清楚在创建文件并将文件推送到 SFTP 服务器时 Pysftp 或 Dropox 是否滞后?

Unclear if either Pysftp or Dropox is lagging when creating and pushing a file to an SFTP server?

我在使用 pysftp 时遇到了一个奇怪的问题。我的代码创建了一个文本文件,然后几乎立即将其推送到使用 pysftp 库的 SFTP 服务器。创建并推送的文本文件保存在 Dropbox 文件夹中。

我在代码的推送部分间歇性地遇到 'Errno[2] File Does not exist' 错误。几乎就好像创建的文件有时不能足够快地用于下一部分代码,我怀疑这可能是由于 Dropbox 的滞后。我可以放入一个 EXISTS 部分等待,但想在继续之前检查我的怀疑是否正确?这段代码在 90% 的时间里都运行良好,这有点奇怪。

下面用 *** 代替凭据的代码:

def get_sec_info(bb_req_dir,bb_req_name,bb_firmname,sec_missing):

    #Build request file and return the filepath
    filepath = bb_req_file(bb_req_dir,bb_req_name,bb_firmname,sec_missing)

    #Send the file to Bloomberg, wait and download response file. Returns the filename of the response file.
    dir_response = bb_upload_download(filepath,bb_req_name)

    df_secs = parse_response(dir_response)

    return df_secs



def bb_req_file(bb_req_dir,bb_req_name,bb_firmname,sec_missing):
    #Build req file
    filepath = bb_req_dir + bb_req_name + '.req'
    req_file = open(filepath,'w+')

    with req_file:
        req_file.write('START-OF-FILE')
        req_file.write('\n')
        req_file.write('FIRMNAME=' + bb_firmname)
        req_file.write('\n')
        req_file.write('FILETYPE=pc')
        req_file.write('\n')
        req_file.write('REPLYFILENAME=' + bb_req_name + '.out')
        req_file.write('\n')
        req_file.write('SECMASTER=yes')
        req_file.write('\n')
        req_file.write('DATEFORMAT=ddmmyyyy')
        req_file.write('\n')
        req_file.write('PROGRAMNAME=getdata')
        req_file.write('\n')
        req_file.write('PROGRAMFLAG=adhoc')
        req_file.write('\n')
        req_file.write('MIFIR=yes')
        req_file.write('\n')
        #Add the fields being requested
        req_file.write('START-OF-FIELDS')        
        req_file.write('\n')
        req_file.write('CFI_CODE')
        req_file.write('\n')
        req_file.write('END-OF-FIELDS')
        req_file.write('\n')
        #Add the securities
        req_file.write('START-OF-DATA')
        req_file.write('\n')
        for sec in sec_missing:
            req_file.write(''.join(sec))
            req_file.write(' |Ticker|')
            req_file.write('\n')

        #Close
        req_file.write('END-OF-DATA')
        req_file.write('\n')
        req_file.write('END-OF-FILE')

    req_file.close()

    return filepath



def bb_upload_download(filepath,bb_req_name):

    warnings.filterwarnings('ignore','.*hostkeys')

    cnopts = pysftp.CnOpts()
    cnopts.hostkeys = None

    with pysftp.Connection('****', username='****', password='****', cnopts=cnopts) as sftp:


        sftp.put(filepath)
        response = filepath[:-3] + 'out'
        file_response = bb_req_name + '.out'

        exists = False
        while exists == False:
            exists = sftp.isfile(file_response)

        sftp.get(file_response,response)


    return response 

安迪

好的,我似乎已经解决了这个问题,我想我会给出一个答案以防对其他人有帮助。

问题是由于我将文件推送到的 SFTP 服务器造成的误导,处理速度如此之快以至于 Pysftp 无法获得它已成功上传的确认响应。

修复是在 sftp.put() 命令中加入 confirm=False。