Pythonスクリプトのサブプロセスからssh経由でrsyncを実行して、あるサーバーから別のサーバーにイメージをコピーしようとしています。次のように定義された関数があります。
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, "jill@" + 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} jill@10.12.27.20:/home/jill/web/public/static/
そして実際、私のprintステートメントの出力は次のとおりです。
executing rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} jill@10.12.27.20:/home/jill/web/public/static/
しかし、この python スクリプト内から実行すると、2 つの問題があります。
- len(bookIds) > 1 の場合、/shared/books/ の下のサブディレクトリのリストが bash または rsync によって何らかの形で誤って解釈されます。エラーメッセージは次のとおりです。
- rsync: link_stat "/shared/books/{book_482,book_347}" が失敗しました: そのようなファイルまたはディレクトリはありません (2))
- len(bookIds) == 1 の場合、ソース ディレクトリにあるすべてのファイルが再同期されます (*.jpg だけでなく、意図したとおりです)。
subprocess.call 関数では、一部の文字をエスケープする必要があるかのようです。