不清楚在创建文件并将文件推送到 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。
我在使用 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。