Мне нужно запустить rsync из приложения Python 2.7 в Windows 7 x64 (с использованием cwRsync 5.5.0).

Все отлично работает из командной строки: установите CWRSYNCHOME в env в двоичные файлы cwrsync и выполните следующую команду

rsync.exe "/cygdrive/e/test" test1@192.168.1.14:

Но при попытке запустить ту же команду, что и подпроцесс python:

process = subprocess.Popen(['rsync.exe', '/cygdrive/e/test', 'test1@192.168.1.14:'],
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           shell=True,
                           env={'CWRSYNCHOME': './bin'})

stdout, stderr = process.communicate()
print 'STDOUT:{}\nSTDERR:{}'.format(stdout, stderr)

Я получаю следующую ошибку в stderr:

rsync: pipe: Operation not permitted (1)
rsync error: error in IPC code (code 14) at pipe.c(59) [sender=3.1.2]

Вот подробный стандартный вывод rsync:

FILE_STRUCT_LEN=16, EXTRA_LEN=4
cmd= machine=192.168.1.14 user=test1 path=.
cmd[0]=ssh cmd[1]=-l cmd[2]=test1 cmd[3]=192.168.1.14 cmd[4]=rsync cmd[5]=--server cmd[6]=-vvvvve.LsfxC cmd[7]=. cmd[8]=. 
opening connection using: ssh -l test1 192.168.1.14 rsync --server -vvvvve.LsfxC . .  (9 args)
[sender] _exit_cleanup(code=14, file=pipe.c, line=59): entered
[sender] _exit_cleanup(code=14, file=pipe.c, line=59): about to call exit(14)

Пробовал установить shell = False и передать команду как одну строку (не cmd и args) - ошибка повторяется.

Что я делаю не так?

Ответы (1)

Чтобы он заработал, необходимо запустить rsync под оболочкой cygwin:

process = subprocess.Popen(['sh.exe', '-c',
                            'rsync /cygdrive/e/test test1@192.168.1.14:'],
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           stdin=subprocess.PIPE,
                           env={'CWRSYNCHOME': '/bin/',
                                'PATH': '/bin/'})

Работает (в примере выше нет авторизации ssh).

2022 WebDevInsider