Python sh模块无法识别模式匹配问题求助
解决Python sh模块执行带通配符的du命令报错问题
这个问题我之前也踩过坑!本质原因是终端shell和sh模块处理通配符的逻辑完全不一样:
- 你在终端敲
du -sh /some/regex.*/over?/here.txt时,是终端的shell先帮你把通配符*、?解析成实际存在的文件/目录路径,再把这些真实路径传给du命令; - 但sh模块默认会直接把带通配符的字符串原封不动作为参数传给du,而du本身根本不认识shell的通配符语法,自然就报错了。
下面给你三种靠谱的解决办法,按需选择:
方法1:让sh模块通过shell执行命令
直接给sh.du加上_shell=True参数,让sh启动一个shell进程来处理通配符,完全模拟终端的执行逻辑:
import sh print(sh.du("-sh", "rsync_perf/d*/xa*", _shell=True))
⚠️ 注意:如果你的参数里包含用户输入的内容,用这个方法要小心命令注入风险,一定要做参数校验!
方法2:手动用glob模块展开通配符
自己先把通配符解析成真实路径,再传给du,这种方式更安全,适合参数可控的场景:
import sh import glob # 展开通配符,得到所有匹配的路径列表 matched_paths = glob.glob("rsync_perf/d*/xa*") if matched_paths: # 用*把列表展开成多个位置参数传给du print(sh.du("-sh", *matched_paths)) else: print("没有匹配到任何文件或目录")
方法3:用sh模块内置的glob功能
sh模块本身也封装了glob的能力,用法和方法2类似,更贴合sh模块的使用习惯:
import sh matched_paths = sh.glob("rsync_perf/d*/xa*") if matched_paths: print(sh.du("-sh", *matched_paths)) else: print("没有匹配到任何文件或目录")
内容的提问来源于stack exchange,提问作者OneRaynyDay
相关产品推荐
相关产品推荐

