使用Python subprocess调用find命令遇-regex报错求助
解决subprocess调用find命令的错误问题
我来帮你分析一下问题所在,你遇到的错误主要是两个细节没处理好:参数里的多余空格和不必要的引号。
错误原因拆解
- 参数前的多余空格:你写的
" -regex"前面带了空格,这会让find把这个带空格的字符串当成一个要查找的文件名,而不是命令选项,所以才会报错find: -regex: No such file or directory(这里的-regex其实是带前导空格的参数,find找不到这个文件)。 - 不必要的引号:在subprocess的列表参数模式下,每个元素都会被直接作为独立参数传给
find,不需要给正则表达式加双引号。你加了'".*\.odt"',会让find把带引号的字符串当成正则的一部分,同时还会尝试把它当作文件名查找,于是出现find: ".*level2\.odt": No such file or directory的错误。
正确的代码写法
把参数里的多余空格去掉,同时去掉正则表达式的引号,另外注意Python字符串里的反斜杠需要转义(或者用原始字符串):
import subprocess # 使用普通字符串,注意转义反斜杠 subprocess.run(["find", dirPath, "-regex", ".*\\.odt", "-type", "f", "-maxdepth", "1"]) # 或者用原始字符串,更简洁 subprocess.run(["find", dirPath, "-regex", r".*\.odt", "-type", "f", "-maxdepth", "1"])
额外说明
如果你的场景允许使用shell=True(注意如果dirPath包含特殊字符可能有安全风险),也可以直接写完整的命令字符串:
subprocess.run(f"find {dirPath} -regex '.*\\.odt' -type f -maxdepth 1", shell=True)
不过更推荐用列表参数的方式,因为它避免了shell注入的风险,也不需要处理复杂的字符串转义问题。
内容的提问来源于stack exchange,提问作者Lone Ronin
相关产品推荐
相关产品推荐

