我有一个 Python 程序,它读取文件然后将它们压缩成一定大小的压缩包。
我的一个文件中不仅有空格,而且还包含括号。我有以下代码:
cmd = "/bin/tar -cvf " + tmpname + " '" + filename + "'"
注意:这些是文件名变量外双引号内的单引号。有点难看。
其中 tmpname 和 filename 是 for 循环中的变量,每次迭代都会发生变化(不相关)。
如您所见,我正在压缩的文件名包含文件名周围的单引号,以便 shell (bash) 按原样解释它,并且不会尝试执行 ""将执行的变量替换或程序执行` 会做。
据我所知,cmd 变量包含 shell 用来解释命令的准确语法。但是,当我运行以下替换 cmd 变量的子进程命令时:
cmdobj = call(cmd, shell=True)
我得到以下输出/错误:
/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
我什至在运行 subprocess 命令之前将命令打印到控制台,以查看它在 shell 中运行时的外观,它是:
cmd: /bin/tar -cvf tempname0.tar '237-r Property Transport Request (PTR) 012314.pdf'
当我按原样在 shell 中运行上述命令时,它工作得很好。不太确定这里发生了什么。请帮忙!
请您参考如下方法:
如果从一个不同的目录:
from subprocess import check_call
check_call(["tar","-cvf",tmpname ,"Property Transport Request (PTR) 012314.pdf"])
也使用 tar 而不是 'bin/tar'。 check_call如果命令返回非零退出状态,将引发 CalledProcessError。
