Skip to main content
 首页 » 编程设计

python 子进程模块无法解析具有特殊字符 "("的文件名

2025年05月04日15haluo1

我有一个 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。