Ткань 2.x: гудрон и сквозная труба - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу сделать эквивалент этого сценария оболочки:

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'

Наряду с некоторыми другими ошибками .Я понимаю, что это, вероятно, потому что поток, который я получаю из reader_proc.stdin, является потоком байтов, а не потоком Unicode.Но я не понимаю, зачем run нужен поток в юникоде, или какое правильное изменение должно было бы заставить его работать.

1 Ответ

0 голосов
/ 13 февраля 2019

Я не могу комментировать, почему задача, выполняемая с помощью 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'
    )
...