StringIO
무엇입니까? (
doc page)
SFTPClient
의 get()
및 put()
기능 경로를 가지고 파일 핸들을하지, 조금 어색한 상황을 만든다.
paramiko.SFTPClient
에 대한 래퍼를 작성하여 원하는 기능을 제공 할 수 있습니다. 그것이 작동하는 경우
from paramiko import SFTPClient
class SFTPClient2(SFTPClient):
def put(self, local_file, remotepath, callback=None, confirm=True):
fl = source_file
file_size = os.fstat(fl.fileno()).st_size
try:
fr = self.file(remotepath, 'wb')
fr.set_pipelined(True)
size = 0
try:
while True:
data = fl.read(32768)
if len(data) == 0:
break
fr.write(data)
size += len(data)
if callback is not None:
callback(size, file_size)
finally:
fr.close()
finally:
fl.close()
if confirm:
s = self.stat(remotepath)
if s.st_size != size:
raise IOError('size mismatch in put! %d != %d' % (s.st_size, size))
else:
s = SFTPAttributes()
return s
def get(self, remotepath, local_file, callback=None):
fr = self.file(remotepath, 'rb')
file_size = self.stat(remotepath).st_size
fr.prefetch()
try:
fl = local_file
try:
size = 0
while True:
data = fr.read(32768)
if len(data) == 0:
break
fl.write(data)
size += len(data)
if callback is not None:
callback(size, file_size)
finally:
fl.close()
finally:
fr.close()
s = os.fstat(fl.fileno())
if s.st_size != size:
raise IOError('size mismatch in get! %d != %d' % (s.st_size, size))
에서, get
및 put
기능은 이제 로컬 파일 핸들이 아닌 경로를 취해야한다 :
여기 최선 검증되지 않은 시도이다.
경로에서 파일을 여는 코드를 제거하고 파일 크기를 가져 오는 코드를 os.fstat
대신 os.stat
대신 변경해야했습니다.
아니요, 이미 파일과 유사한 객체가 있습니다. 문제는'paramiko.SFTPClient.put'가 파일 대신 경로를 사용한다는 것입니다. 어떤 경우에는 임시 파일에 쓰는 "파일"이 이미 StringIO 객체입니다. –
paramiko의 소스를 살펴 보았는데 함수가 경로를 취한다는 것을 알았습니다. 위의 붙여 넣은 함수를 수정하기 위해 약간의 래퍼를 작성했습니다. – Acorn