Как передавать поток с одного SFTP на другой SFTP с помощью python и pysftp

Я хочу перенести файлы с одного SFTP-сервера на другой.

Я не хочу писать локально и не хочу читать весь файл в память.

Pysftp имеет методы getfo и putfo.

Но getfo не дает вам читателя - он просто записывает в открытый файл obj.

По сути, я хочу передать getfo по конвейеру какому-то подобному файлу, из которого можно читать, поэтому я могу предоставить его в качестве читателя для putfo, чтобы отправить его в цель.

Псевдокод:

buffer_obj = SomeBufferedIOReader()
source_sftp.getfo('/remote/path.txt.gz', buffer_obj)
target_sftp.putfo('/target/path.txt.gz', buffer_obj) # streaming commences

Если бы я делал это в bash, я бы создал файл fifo, записал в него асинхронно, а затем загрузил бы из этого файла. Когда файл был загружен, FIFO будет исчерпан, и процесс завершится. Не уверен, как сделать эквивалент в Python.


person dstandish    schedule 07.08.2019    source источник


Ответы (1)


Хорошо ... ну .... pysftp предоставляет open метод.

with source_sftp.open('source/path.txt.gz', 'rb') as f:
    f.prefetch()
    target_sftp.putfo('target/path.txt.gz', f)
person dstandish    schedule 07.08.2019
comment
да. Но проверьте getfo код. Вы должны вызвать f.prefetch, как и он, для повышения производительности. - person Martin Prikryl; 08.08.2019
comment
Спасибо @MartinPrikryl, я добавил. И что вы имеете в виду проверить getfo код? Что вы предлагаете мне искать? - person dstandish; 08.08.2019
comment
Я имел в виду, что вы должны проверить getfo код, чтобы увидеть, что он делает - он вызывает prefetch. - person Martin Prikryl; 08.08.2019
comment
Удивительно, но этого нет в документации pysftp - person TheKitMurkit; 01.06.2021