python 子进程模块无法解析包含特殊字符“(”的文件名

python subprocess module can't parse filename with special characters "("

我有一个 Python 程序可以读取文件,然后 tar 将它们放入 tar 特定大小的球中。

我的一个文件中不仅有空格,还有括号。我有以下代码:

cmd = "/bin/tar -cvf " +  tmpname +  " '" + filename + "'"

注意:这些是文件名变量外双引号内的单引号。有点难看。

其中 tmpnamefilename 是 for 循环中的变量,每次迭代都会发生变化(无关紧要)。

如您所见,我正在 tarballing 的文件名在文件名周围包含单引号,因此 shell (bash) 按字面意思解释它,而不是' t 尝试执行 "" 将执行的变量替换或 ` 将执行的程序执行。

据我所知,cmd 变量包含 shell 的确切语法,可以按照我的意愿解释命令。但是,当我 运行 以下子进程命令替换 cmd 变量时:

cmdobj = call(cmd, shell=True)

我得到以下 output/error:

/bin/tar: 237-r Property Transport Request (PTR) 012314.pdf: Cannot stat: No such file or directory

/bin/tar: Exiting with failure status due to previous errors

unable to tar: 237-r Property Transport Request (PTR) 012314.pdf

我什至在 运行ning 子进程命令之前将命令打印到控制台,以查看在 shell 中 运行ning 时它会是什么样子,它是:

cmd: /bin/tar -cvf tempname0.tar '237-r Property Transport Request (PTR) 012314.pdf'

当我 运行 在 shell 中执行上述命令时,它工作得很好。不太确定这里发生了什么。请帮忙!

作为 subprocess 模块一部分的 call 方法应该传递一个字符串数组。

在命令行上你会调用

tar -cvf "file folder with space/"

以下等价于python

call(["tar", "-cvf", "file folder with space/"])

您正在 shell

中拨打此电话
"tar -cvf 'file folder with space/'"

这导致 shell 查找名称与 `tar -cvf 'file folder with space/'

完全相同的程序

这避免了字符串连接,从而使代码更清晰。

传递 argslist 不带 shell=True 完整路径 如果 运行 来自不同的文件目录:

from subprocess import check_call

check_call(["tar","-cvf",tmpname ,"Property Transport Request (PTR) 012314.pdf"])

也使用 tar 而不是 'bin/tar'。如果命令 returns 非零退出状态,check_call 将引发 CalledProcessError