python 子进程模块无法解析包含特殊字符“(”的文件名
python subprocess module can't parse filename with special characters "("
我有一个 Python 程序可以读取文件,然后 tar 将它们放入 tar 特定大小的球中。
我的一个文件中不仅有空格,还有括号。我有以下代码:
cmd = "/bin/tar -cvf " + tmpname + " '" + filename + "'"
注意:这些是文件名变量外双引号内的单引号。有点难看。
其中 tmpname
和 filename
是 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/'
完全相同的程序
这避免了字符串连接,从而使代码更清晰。
传递 args
的 list
不带 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
。
我有一个 Python 程序可以读取文件,然后 tar 将它们放入 tar 特定大小的球中。
我的一个文件中不仅有空格,还有括号。我有以下代码:
cmd = "/bin/tar -cvf " + tmpname + " '" + filename + "'"
注意:这些是文件名变量外双引号内的单引号。有点难看。
其中 tmpname
和 filename
是 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/'
完全相同的程序这避免了字符串连接,从而使代码更清晰。
传递 args
的 list
不带 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
。