`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。
我在 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。