`subprocess.call`与直接在shell

时间:2016-03-17 10:39:14

标签: python shell subprocess rsync

我在Python中有以下命令,我编写的目的是只将.yaml文件从source目录(在网络上)复制到本地target目录:< / p>

import subprocess as sp

cmd = ['rsync', '-rvt',  "--include='*/*.yaml'",  "--exclude='*/*'",
     source , destination]

print ' '.join(cmd)
sp.call(cmd)

但是,当我运行此Python时,会复制所有文件,包括.jpg等。

当我直接运行shell命令时:

rsync -rvt --include='*/*.yaml' --exclude='*/*' <source> <target>

...然后只按预期复制.yaml个文件。

这里发生了什么?为什么命令在shell中的运行方式与subprocess.call下的运行方式不同?

(这是在Ubuntu 14.04上使用Bash shell,使用Anaconda的Python 2)

1 个答案:

答案 0 :(得分:3)

您应该删除通配符周围的单引号:

['rsync', '-rvt',  "--include=*/*.yaml",  "--exclude=*/*",     source , destination]

这些引用由shell处理,shell不会将引号传递给rsync。