gpt4 book ai didi

python - Fabric 2.x : tar and untar through pipe

转载 作者:行者123 更新时间:2023-12-01 01:13:37 32 4
gpt4 key购买 nike

我想要执行与此 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'
)

关于python - Fabric 2.x : tar and untar through pipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54596420/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com