subprocess cp将一些文件留空

时间:2017-12-08 21:55:41

标签: python macos subprocess

我正在尝试将一些文件从一个目录复制到另一个目录。我希望一个目录中的所有文件都以另一个目录的根目录结束。

当我在终端中运行它时,此命令完全符合我的要求:

cp -rv ./src/CopyPasteIntoBuildDir/* ./build-root/src/

然而,这行python复制了大部分文件,就像上面的命令一样,但是它将一些新文件留空。具体来说,子目录中的文件是空的。

subprocess.check_call("cp -rv ./src/CopyPasteIntoBuildDir/* ./build-root/src/", shell=True)

如果文件不在那里,它会创建文件,如果文件不存在则会截断它们。

发生了什么事?

2 个答案:

答案 0 :(得分:1)

假设您决定使用cp而不是本机Python操作 -

如果您将代码写入而不是调用任何shell ,则此代码将更加可靠。为了避免在源上需要/*(以及它的副作用 - 即拒绝复制名称超过ARG_MAX组合环境和命令行大小存储限制的目录),请使用{ {1}}作为要复制其内容的目录名称的最后一个元素,而不是传递需要由shell扩展的通配符。

.

subprocess.check_call(["cp", "-R", "--", '%s/.' % src, dest]) 而不是cp -R的使用是cp -rv,而不是-R,是POSIX标准化的(因此可以在所有兼容的UNIX类平台上移植)

演示动作(复制/可粘贴代码)

-r

...发出的输出类似于:

tempdir=$(mktemp -d -t testdir.XXXXXX)
trap 'rm -rf "$tempdir"' EXIT

cd "$tempdir"
mkdir -p ./src/CopyPasteIntoBuildDir/subdir-1 ./build-root/src/
touch ./src/CopyPasteIntoBuildDir/file-1
touch ./src/CopyPasteIntoBuildDir/subdir-1/file-2

script='
import sys, shutil, subprocess

src = sys.argv[1]
dest = sys.argv[2]
subprocess.check_call(["cp", "-R", "--", "%s/." % src, dest])
'

python -c "$script" ./src/CopyPasteIntoBuildDir ./build-root/src/
find ./build-root -type f -print
rm -rf "$tempdir"

...显示内容已正确递归复制,没有前缀。

答案 1 :(得分:-1)

显然这是standard error的问题。使用bash代替工作。

sh

编辑:看到接受的答案!