使用Python运行Rsync

38

我需要从Python运行一个rsync命令,这是否可行?如果可行,我该怎么做?

rsync -Ccavz --delete DJStatic username@website

3
你可以从Python中运行shell命令,参见http://docs.python.org/2/library/subprocess.html。此外,`fabric`提供了一个很好的API来包装许多常用的shell命令,详情请参见http://docs.fabfile.org/en/1.4.0/index.html。 - dm03514
2
在2017年,现在有一个纯Python的rsync库:pyrsync(不是一个包装器)。 - philshem
1
@philshem:看起来这个仓库自2013年以来就没有更新了。与系统调用相比,它提供了什么优势? - Bryan P
我编写了一个非常基本的包装器,使用系统的rsync和Python的子进程,为我的个人目的提供一些功能,例如打印进度等:https://github.com/lfreist/PyRsync... - prog2de
1个回答

31

以下片段展示了如何在Python中调用子进程

import subprocess
subprocess.call(["ls", "-l"])

在你的情况下,应该是这样的

subprocess.call(["rsync", "-Ccavz", "--delete","DJStatic", "username@website"])

更多详细信息请看这里


8
subprocess.call("rsync -Ccavz --delete DJStatic username@website".split()) 的写法更易读,打起来也更实用。 - jolvi
15
如果您的参数中没有空格,可以使用以下命令:@jolvi - blueFast
6
请使用shlex.split(s)代替常规的s.split()来像正常(POSIX)shell一样拆分参数。 - Chris L. Barnes
2
不应使用@jolvi的版本(将命令作为字符串传递)!将参数作为字符串列表传递。当您无法确定由于某个变量中的引号或空格而导致您的shell命令未执行预期操作时,这将节省大量调试时间。仅仅为了节省2-3秒的打字时间而做出的权衡是不值得的。 - Brandon
@Brandon: 对于那些命令中没有空格的人来说,这完全没问题,并且更容易实现。如果有空格,则可以使用shlex.split()代替split()进行修复,正如Chris L. Barnes所提到的。我认为,如果您谨慎使用,那么使用该解决方案是可以的。除非...这会引起其他具体问题吗? - jvriesem
@jvriesem 您是100%正确的,使用 shlex.split 可以解决这个问题,只要您确保在将命令作为字符串传递时始终使用它。 - Brandon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接