`subprocess.call` 与直接在 shell 中的 运行 命令的操作不同

`subprocess.call` operates differently to running command directly in shell

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

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)

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

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

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