Неясно, отстает ли Pysftp или Dropox при создании и отправке файла на SFTP-сервер? - PullRequest
0 голосов
/ 18 апреля 2019

У меня странная проблема с pysftp.Мой код создает текстовый файл, а затем почти немедленно передает его на сервер SFTP с помощью библиотеки pysftp.Текстовый файл, который создается и затем передается, сохраняется в папке Dropbox.

Периодически я получаю ошибки «Errno [2] File Not not» »в push-части кода.Похоже, что созданный файл иногда не доступен достаточно быстро для следующей части кода, и я подозреваю, что это может быть связано с задержкой 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 

Andy

1 Ответ

0 голосов
/ 20 апреля 2019

Хорошо, я, кажется, решил эту проблему и подумал, что я бы поставил ответ, если это поможет другим.

Проблема была в заблуждении из-за SFTP-сервера, на который я загружал файл, обрабатывая его так быстро, чтоPysftp не может получить ответ, подтверждающий успешную загрузку.

Исправлена ​​ошибка, из-за которой в команде sftp.put () ставилось подтверждение = Ложь.

...