Я пытаюсь выполнить rsync через ssh из подпроцесса в python script, чтобы скопировать изображения с одного сервера на другой. У меня есть функция, определенная как:
def rsyncBookContent(bookIds, serverEnv):
bookPaths = ""
if len(bookIds) > 1:
bookPaths = "{" + ",".join(("book_"+str(x)) for x in bookIds) + "}"
else:
bookPaths = "book_" + str(bookIds[0])
for host in serverEnv['content.hosts']:
args = ["rsync", "-avz", "--include='*/'", "--include='*.jpg'", "--exclude='*'", "-e", "ssh", options.bookDestDir + "/" + bookPaths, "[email protected]" + host + ":/home/jill/web/public/static/"]
print "executing " + ' '.join(args)
subprocess.call(args)
В конечном итоге я пытаюсь выполнить Python (что работает из оболочки bash):
rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
И действительно, моя заявка на печать выводит:
executing rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
Но при выполнении из этого python script возникают две проблемы:
- Если len (bookIds) > 1, список подкаталогов под/shared/books/каким-то образом неверно истолкован bash или rsync. Сообщение об ошибке:
- rsync: link_stat "/shared/books/{book_482, book_347}" не удалось: нет такого файла или каталога (2))
- Если len (bookIds) == 1, все файлы под исходным каталогом rsynced (а не только *.jpg, как и мои намерения)
Кажется, что функция subprocess.call требует, чтобы некоторые символы были экранированы или что-то еще, no?