Python конвейерный вывод между двумя подпроцессами - PullRequest
10 голосов
/ 31 января 2011

Я работаю над кодом, который будет DD блочного устройства через SSH, и я хочу сделать это с подпроцессом, чтобы я мог отслеживать состояние DD во время передачи (убивая процесс dd с помощью SIGUSR1, чтобы получить его текущее состояние и чтение с использованием select).

Команда, которую я пытаюсь реализовать, будет выглядеть примерно так:

dd if=/dev/sda | ssh root@example.com 'dd of=/dev/sda'

Текущий метод, который я попробовал, был:

dd_process = subprocess.Popen(['dd','if=/dev/sda'],0,None,None,subprocess.PIPE, subprocess.PIPE)  
ssh_process = subprocess.Popen(['ssh','root@example.com','dd of=/dev/sda'],0,None,dd_process.stdout)

Однако, когда я запускаю это, процесс SSH перестает функционировать через 10-40 секунд.
Я совершенно тупой, или нет способа соединить такие подпроцессы?

Редактировать: Оказывается, в моем реальном коде не было имени хоста. Это правильный способ делать вещи.

Ответы [ 2 ]

19 голосов
/ 31 января 2011
from subprocess import Popen, PIPE
dd_process = Popen(['dd', 'if=/dev/sda'], stdout=PIPE)
ssh_process = Popen(['ssh', 'root@example.com', 'dd','of=/dev/sda'],stdin=dd_process.stdout, stdout=PIPE)
dd_process.stdout.close() # enable write error in dd if ssh dies
out, err = ssh_process.communicate()

Это способ ТРУБЫ от первого выхода процесса до второго. (обратите внимание на стандартный ввод в ssh_process)

4 голосов
/ 13 марта 2013

Библиотека Python sh упрощает вызов команд ОС и их конвейеризацию.

Из документации:

for line in tr(tail("-f", "test.log", _piped=True), "[:upper:]", "[:lower:]", _iter=True):
    print(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...