我有一个Python程序,该程序读取文件,然后将它们焦油化成一定大小的tar球。
我的一个文件不仅包含空格,而且还包含括号。我有以下代码:
cmd = "/bin/tar -cvf " + tmpname + " '" + filename + "'"
注意:这些是在文件名变量之外的双引号内的单引号。有点很难看。
其中tmpname
和filename
是for循环中的变量,每次迭代都会更改(不相关)。
如您所见,我正在压缩文件名的文件名包含单引号,以便外壳程序(bash)按原样解释它,并且不尝试执行变量替换(“”将执行或程序执行“将”执行) 。
据我所知,该cmd
变量包含用于shell解释所需命令的确切语法。但是,当我运行以下子流程命令替换cmd变量时:
cmdobj = call(cmd, shell=True)
我得到以下输出/错误:
/ bin / tar:237-r属性传输请求(PTR)012314.pdf:无法统计:没有此类文件或目录
/ bin / tar:由于先前的错误而以失败状态退出
无法焦油:237-r属性运输请求(PTR)012314.pdf
在运行subprocess命令之前,我什至将命令输出到控制台,以查看在shell中运行时的外观,它是:
cmd: /bin/tar -cvf tempname0.tar '237-r Property Transport Request (PTR) 012314.pdf'
当我在shell中运行上述命令时,它工作正常。不太确定这是怎么回事。请帮忙!
传递list
的args
不shell=True
和完整路径,如果从不同的目录中运行该文件:
from subprocess import check_call
check_call(["tar","-cvf",tmpname ,"Property Transport Request (PTR) 012314.pdf"])
也tar
不要使用'bin/tar'
。如果命令返回非零退出状态,则check_call将引发a CalledProcessError
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句