Sto provando ad eseguire rsync su ssh da un sottoprocesso in uno script python per copiare immagini da un server a un altro. Ho una funzione definita come:chiamare rsync da python 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)
Quello che sto in ultima analisi, cercando di fare è di avere Python eseguire questo (che funziona da una shell bash):
rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
E in effetti la mia uscite istruzione print:
executing rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
Ma quando eseguito dall'interno di questo script python, ci sono due problemi:
- se len (bookIds)> 1, l'elenco delle sottodirectory in/shared/books/è in qualche modo erroneamente interpretato da bash o rsync. Il messaggio di errore è:
- rsync: link_stat "/ shared/libri/{book_482, book_347}" non riuscita: Nessun file o directory (2))
- se len (bookIds) == 1, tutti file nella directory di origine vengono rsynced (non solo * .jpg, come è mia intenzione)
sembra come se la funzione subprocess.call richiede alcuni caratteri da sfuggiti o qualcosa del genere, no?
Per curiosità, cosa succede se si imposta 'shell = true' nella chiamata? Ad esempio, 'subprocess.call (args, shell = True)' – sberry