2014-10-31 137 views
3

我在Python中使用paramiko。我需要一个SFTP文件到一个远程Linux机器上(开发平台是windows)。这里是代码(工作)Python SFTP:使用SFTP将内存流放入远程文件夹。像FTP storbinary

import paramiko 
client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(HOST, username=USERNAME, password=PASSWORD) 
stdin, stdout, stderr = client.exec_command("cd %s; pwd" % PATH) 
data = stdout.readlines() 
print "Current folder:" 
for line in data: 
    print (line.rstrip()) 
sftp = client.open_sftp() 
sftp.put(local_path, PATH + '/' + FILE_NAME, confirm = True) 

sftp.close() 
client.close() 

这工作正常。但要调用put(),我需要将文件保存到local_path,这需要很长时间。

我想知道是否有一种方法可以像ftp一样在内存流中执行sftp。 对于FTP,它具有更快的内存流(工作):

import ftplib 
ftp_conn = ftplib.FTP(HOST, USERNAME, PASSWORD) 
ftp_conn.cwd(FILE_PATH) 
ftp_conn.storbinary('STOR '+posixpath.basename(FILE_PATH), buffer, blocksize=1024) 
ftp_conn.close() 

非常感谢!

+5

你应该能够调用['open'(http://docs.paramiko.org/en/1.15/api/sftp。 html#paramiko.sftp_client.SFTPClient.open)(而不是'put'),然后将数据写入生成的文件对象。没有临时文件系统文件需要。 – 2014-10-31 20:25:13

+0

@AndrewMedico打开是用于打开远程文件,不是吗?我没有在远程linux框中的文件。谢谢 – Payson 2014-11-01 18:57:51

+0

不,该文件不需要事先存在。 open调用将创建一个新的空文件,并让你将数据写入它(就像本地操作一样)。 – 2014-11-01 18:59:04

回答

0

你应该能够做这样的事情:

import shutil 

with sftp.open("/path/to/remote/file", mode="w") as remote_file: 
    shutil.copyfileobj(file_string_io, remote_file)