You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:40:05