sh:在 Python 里直接调系统命令

文章目录

sh:在 Python 里直接调系统命令

如果写过 Python,大概率用过 subprocess 模块。每次想调一个系统命令,得 import subprocess,再 Popen 或者 run,参数拼成列表,处理返回值,捕获异常。一套流程下来,代码量翻了几倍。这种体验说不上差,但总觉得可以更直接。

sh 这个库的思路就是:把系统命令变成 Python 函数调用。装了之后,你操作的就是一个可调用对象:

python 复制代码
from sh import git
git("status", "--short")

git 就是一个 Python 函数,不用拼字符串、不用管 shell 参数解析。sh 支持 Python 3.8 到 3.14 以及 PyPy,pip 安装就能用。项目在 GitHub 上已有 7,200+ Star,作者 Andrew Moffat 维护了超过十年,稳定性经得起考验。

解决了什么问题

Python 的 subprocess 抽象层级低。你要执行一条命令,写的却是进程管理代码:创建进程、等待结束、读取输出、检查返回值。sh 把底层细节藏起来,让你关注「做什么」,不用操心「怎么启动进程」。

sh 的映射规则很简单:每个系统命令封装成一个可调用对象,命令参数直接当函数参数传,关键字参数对应命令行选项。ls -l 写成 ls("-l")git status --short 写成 git("status", "--short")。这种对应关系不需要查文档就能猜到。

举几个实际用法。逐行读取日志文件:

python 复制代码
from sh import tail
for line in tail("-f", "/var/log/syslog", _iter=True):
    print(line)

带超时的文件查找:

python 复制代码
from sh import find
try:
    find(".", "-name", "*.py", _timeout=10)
except sh.TimeoutException:
    print("查找超时")

sh 还提供 _out_err_done_bg 等参数控制输出、错误处理、回调和异步执行。这些参数用下划线前缀标记,和普通命令参数区分开。需要后台执行时加个 _bg=True 就行,sh 会自动处理进程生命周期。

实际用起来怎样

日常就是一行函数调用。不用记 subprocess 的 Popen 参数列表,不经过 shell 所以没有命令注入风险。出错时抛的异常自带 stdout 和 stderr,不用手动捕获和拼接,排查方便。

局限也有。sh 依赖 Unix 系统调用,Windows 完全不能用,在纯 Windows 环境工作的需要留意。命令名中带特殊字符(如连字符)时要用 sh.Command() 来调用。每次调用都启动新进程,高频循环场景下性能需要评估。

文档覆盖了从安装到高级用法的所有内容,还提供了一整页的完整版方便丢给 LLM 做上下文参考。

适用场景

如果你经常在 Python 里调系统命令,或者做自动化运维、CI/CD 相关工作,sh 值得一试。它把一个高频操作简化到极致,不做多余的事。和其他同类方案不同,sh 没有自己去实现系统命令的功能,只是做了一层薄封装。这种克制是它能维护十年的原因之一。

sh 的底层机制是高阶函数封装,通过重载 __call__ 把子进程调用伪装成普通函数调用。代码写起来顺手,读起来也自然。如果你觉得 subprocess 用着太啰嗦,从 sh 开始可能就回不去了。

调用。代码写起来顺手,读起来也自然。如果你觉得 subprocess 用着太啰嗦,从 sh 开始可能就回不去了。

相关推荐
默_笙2 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
一起聊电气2 天前
2026工厂智能照明改造怎么做?从能耗痛点看智慧照明的落地路径
其他
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003962 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技2 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
打螺丝的小李2 天前
集团型多基地 QMS 选型:跨工厂质量统一管控谁更强
其他
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
芯片封装工程师2 天前
台式选择性波峰焊接机,精密焊接新选择
其他
只睡四小时2 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas