Tôi đang cố gắng thực thi rsync trên ssh từ một tiến trình con trong kịch bản lệnh python để sao chép hình ảnh từ máy chủ này sang máy chủ khác. Tôi đã một hàm định nghĩa là:gọi rsync từ 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)
Những gì tôi đang cố gắng để cuối cùng làm là có Python thực hiện điều này (trong đó hoạt động từ một vỏ bash):
rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
Và quả thực kết quả đầu ra tuyên bố trên báo của tôi:
executing rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} [email protected]:/home/jill/web/public/static/
Nhưng khi thực hiện từ bên trong kịch bản python này, có hai vấn đề:
- nếu len (bookIds)> 1, danh sách các thư mục con trong/chia sẻ/sách/bằng cách nào đó bị hiểu nhầm bởi bash hoặc rsync. Các thông báo lỗi là:
- rsync: link_stat "/ chia sẻ/sách/{book_482, book_347}" thất bại: Không có tập tin hoặc thư mục (2))
- nếu len (bookIds) == 1, tất cả file trong thư mục nguồn được rsynced (không chỉ là * .jpg, như là ý định của tôi)
có vẻ như nếu chức năng subprocess.call đòi hỏi một số ký tự để được thoát hoặc một cái gì đó, đúng không?
Ra khỏi tò mò, những gì sẽ xảy ra nếu bạn thiết lập 'shell = TRUE' trong cuộc gọi của bạn? Ví dụ, 'subprocess.call (args, shell = True)' – sberry