Возобновление Python после вызова оболочки Tar SSH Pipe?

Я переношу пользовательские карты (например, для карт Google) с моего домашнего сервера на облачный сервер. Кажется, самый быстрый способ их передачи — метод tar ssh pipe.

tar czpf - ./tiles | ssh -i myprivate.key [email protected] "tar xzpf - -C /www/tiles/"

Это прекрасно работает в командной строке, но теперь я хочу, чтобы мой скрипт на Python, который создает плитки, автоматически их выталкивал. Я пытался:

os.system('tar czpf - ./tiles | ssh -i myprivate.key [email protected] "tar xzpf - -C /www/tiles/"')

а также вариант subrprocess.Popen, и они оба копируют все мои фрагменты карты на удаленный сервер, но системная оболочка не закрывается и не возвращает управление скрипту python, поэтому скрипт зависает и не завершается.

Я предполагаю, что что-то происходит с перенаправлением pipe или tar на STDOUT, что не позволяет завершить os.system. Я подумал, что, возможно, удаленный tar, отвечающий за распаковку, ждет большего количества STDIN через канал, но больше ничего не приходит? Я действительно не слишком много знаю об этом и ценю вашу помощь.

Есть ли что-то другое, что я могу сделать, чтобы завершить остальную часть скрипта, но при этом реализовать преимущества метода передачи по каналу tar ssh?

Спасибо!


person pilotandy    schedule 07.03.2016    source источник


Ответы (1)


os.system() устарела в пользу модуля подпроцесса.

Я запустил это в интерпретаторе Python 2.7. Это удалось и сразу же вернуло управление:

import subprocess
try:
    if subprocess.call(["/bin/bash", "tar_ssh.sh"]) == 0:
        print "success!"
    else:
        print "failed! :("
except Exception as e:
    print(str(e))

Он вызывает tar_ssh.sh, который просто содержит вашу команду (предполагает аутентификацию с открытым ключом, а не аутентификацию по парольной фразе):

tar czpf - ./source_folder/ | ssh username@ip_or_hostname "tar xzpf - -C /destination_folder/"
person jDo    schedule 07.03.2016
comment
Дох! Я просто глуп. Мой код также раскручивал очередь многопроцессорной обработки, и при тестировании я закомментировал код, чтобы закрыть его. Как только я использовал ваш код, я понял, что это так. Благодарю вас! - person pilotandy; 07.03.2016
comment
@pilotandy Ааа, хорошо, это объясняет! Рад, что у вас все заработало :) - person jDo; 07.03.2016