Próbuję wykonać rsync przez ssh z podprocesu w skrypcie Pythona, aby skopiować obrazy z jednego serwera na drugi. Mam funkcja zdefiniowana jako:Wywołanie rsync z Pythona subprocess.call
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)
Co ja ostatecznie próbuje zrobić, to mieć Python wykonać ten (który współpracuje z powłoki bash):
rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
i rzeczywiście moje wyjścia instrukcji print:
executing rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
Ale gdy wykonywane od wewnątrz skryptu python, istnieją dwa problemy:
- Jeśli len (bookIds)> 1, lista podkatalogów pod/shared/books/jest w jakiś sposób błędnie zinterpretowana przez bash lub rsync. Komunikat o błędzie jest:
- rsync: link_stat "/ Shared/książki/{book_482, book_347}" nie powiodło się: Nie ma takiego pliku lub katalogu (2))
- If Len (bookIds) == 1, wszystkie pliki z katalogu źródłowego są rsynced (nie tylko * .jpg, ponieważ jest moim zamiarem)
Wydaje się, że funkcja subprocess.call wymaga niektóre znaki mają być uciekł albo coś, nie?
z ciekawości, co się dzieje, jeśli ustawisz 'shell = TRUE w zaproszeniu? Na przykład 'subprocess.call (args, shell = True)' – sberry