如何从python中的“with open()as f:”这样的命令处理stdout

时间:2016-08-01 02:25:11

标签: python streaming paramiko

我正在尝试通过ssh传输大文件,并且当前可以正常传输原始文件;如:

with open('somefile','r') as f:
  tx.send(filepath='somefile',stream=f.read())

tx是一个更高级别的类实例,它可以通过这种方式流式传输,但我希望能够使用pvddtar等命令流也是。我需要的是:

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())

但无济于事...... 我一直在谷歌搜索一段时间试图找到一个例子,但到目前为止没有运气。 任何帮助将不胜感激!

2 个答案:

答案 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))

它有效!谢谢你的帮助。