我正在尝试通过ssh传输大文件,并且当前可以正常传输原始文件;如:
with open('somefile','r') as f:
tx.send(filepath='somefile',stream=f.read())
tx是一个更高级别的类实例,它可以通过这种方式流式传输,但我希望能够使用pv
,dd
和tar
等命令流也是。我需要的是:
with run_some_command('tar cfv - somefile') as f:
tx.send(filepath='somefile',stream=f.read())
这会将stdout作为流并写入远程文件。 我尝试过这样的事情:
p = subprocess.Popen(['tar','cfv','-','somefile'], stdout=subprocess.PIPE)
tx.send(filepath='somefile',stream=p.stdout.readall())
但无济于事...... 我一直在谷歌搜索一段时间试图找到一个例子,但到目前为止没有运气。 任何帮助将不胜感激!
答案 0 :(得分:0)
我认为唯一的问题是.readall()
方法,它不存在。
您可以使用p.stdout.read()
来阅读stdout的全部内容:
p = subprocess.Popen(['tar','cfv','-','somefile'], stdout=subprocess.PIPE)
tx.send(filepath='somefile',stream=p.stdout.read())
答案 1 :(得分:0)
我走回去,开始时有一个基本的例子:
calc_table_file = '/mnt/condor/proteinlab/1468300008.table'
import subprocess
class TarStream:
def open(self,filepath):
p = subprocess.Popen(['tar','cfv','-',filepath], stdout=subprocess.PIPE)
return(p.stdout)
import paramiko
def writer(stream):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('asu-bulk-uspacific', username='labtech', password=password)
client = ssh.open_sftp()
with client.open('/mnt/cold_storage/folding.table','w') as f:
while True:
data = stream.read(32)
if not data:
break
f.write(data)
## works with normal 'open'
with open(calc_table_file,'r') as f:
writer(f)
## and popen :)
tar = TarStream()
writer(tar.open(calc_table_file))
它有效!谢谢你的帮助。