我想做相当于这个shell脚本:
ssh visarend.solasistim.net tar -c /home/amoe/episodes | tar -vx -
但是使用Fabric 2.x.这是我的尝试,但我不确定问题是什么。
remote_path = "/home/amoe/episodes"
c = fabric.Connection('visarend.solasistim.net')
with subprocess.Popen(['tar', '-vx'], stdin=subprocess.PIPE) as reader_proc:
c.run(
"tar -c %s" % (remote_path,),
out_stream=reader_proc.stdin
)
这给了我错误:
File "/usr/local/lib/python3.5/dist-packages/invoke/runners.py", line 525, in write_our_output
stream.write(encode_output(string, self.encoding))
TypeError: a bytes-like object is required, not 'str'
与一些other errors一起。我知道这可能是因为我从reader_proc.stdin
获得的流是字节流,而不是unicode流。但我不明白为什么run需要一个unicode流,或者正确的改变是什么让它工作。
我不能评论为什么通过fabric.Connection.run()
执行的任务被假定为产生文本流,但是,由于latin-1
编码的存在,打包到文本流对象中的实际二进制流可以被重新解释为二进制流而没有任何失真:
import fabric
import subprocess
from io import TextIOWrapper
remote_path = "/home/amoe/episodes"
c = fabric.Connection('visarend.solasistim.net')
with subprocess.Popen(['tar', '-vx'], stdin=subprocess.PIPE) as reader_proc:
c.run(
"tar -c %s" % (remote_path,),
out_stream=TextIOWrapper(reader_proc.stdin, encoding='latin-1'),
encoding='latin-1'
)