Ich versuche rsync über ssh aus einem Subprozess in einem Python-Skript auszuführen, um Bilder von einem Server auf einen anderen zu kopieren. Ich habe eine Funktion wie folgt definiert:rsync aus Python aufrufen 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)
Was ich versuche letztlich zu tun haben Python dies (die von einer Bash-Shell arbeitet) ausführen:
rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
Und in der Tat meine print-Anweisung gibt:
executing rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
Aber wenn aus diesem python-Skript ausgeführt wird, gibt es zwei Probleme:
- Wenn len (bookIds)> 1, wird die Liste der Unterverzeichnisse unter/shared/books/irgendwie von bash oder rsync falsch interpretiert. Die Fehlermeldung lautet:
- rsync: link_stat "/ shared/Bücher/{book_482, book_347}" fehlgeschlagen: Keine solche Datei oder ein Verzeichnis (2))
- wenn len (bookIds) == 1, alle Dateien im Quellverzeichnis sind rsynced (nicht nur * .jpg, wie meine Absicht ist)
scheint, als ob die subprocess.call Funktion einige Zeichen erfordert entkommen oder etwas zu, nicht wahr?
Aus Neugier, was passiert, wenn man 'shell = true' in Ihrem Anruf eingestellt? Zum Beispiel, 'subprocess.call (args, shell = True)' – sberry