如何使用Python脚本捕获Bash命令的执行输出
如何使用Python脚本捕获Bash命令输出
你之前的代码逻辑走不通,核心原因是sys.stdin.readline()只会读取当前Python进程接收到的标准输入流内容——也就是你手动在键盘敲了传给Python的内容,之前Bash已经执行完、打印到终端屏幕上的输出不会自动流入Python的输入流,自然抓不到结果。
要实现执行Python脚本时拿到指定Bash命令的输出,最稳妥的方式是让Python主动启动要执行的Bash命令,直接接管命令的输出流,以下是可直接用的实现方案:
方案1:用Python标准库subprocess(推荐,无额外依赖)
这是Python官方推荐的外部命令调用方式,不需要安装任何第三方包,兼容性最好。
你要实现执行echo sumit并输出sumit的效果,test.py可以写成下面这样:
import subprocess # 填写要执行的Bash命令,拆分为列表形式传参更安全,避免注入风险 cmd = ["echo", "sumit"] # 执行命令,捕获输出流,text=True表示自动把字节流解码为字符串 exec_result = subprocess.run(cmd, capture_output=True, text=True) # 命令输出末尾默认带换行符,用strip()去掉前后多余空白,拿到纯净结果 pure_output = exec_result.stdout.strip() print(pure_output)
写完直接执行python test.py,就会直接打印sumit,完全符合需求。
如果要执行带管道、通配符等复杂Shell语法的命令,可以开启shell=True参数,直接传完整命令字符串即可:
import subprocess # 带管道的复杂命令示例:把sumit转成大写 cmd = "echo sumit | tr 'a-z' 'A-Z'" exec_result = subprocess.run(cmd, shell=True, capture_output=True, text=True) print(exec_result.stdout.strip()) # 执行后输出SUMIT
如果需要和持续运行的交互式命令做交互(比如需要中途输入内容的命令),可以用subprocess.Popen实现更灵活的流控制,简单示例:
import subprocess # 启动命令,接管标准输出流 with subprocess.Popen(["echo", "sumit"], stdout=subprocess.PIPE, text=True) as proc: output = proc.stdout.read().strip() print(output)
注意:不要尝试通过读取终端缓冲区的方式拿已经打印过的历史命令输出,不同终端模拟器的缓冲区实现逻辑差异极大,没有通用稳定的方案,让Python主动启动目标命令、接管输出流才是正确的实现思路。
内容的提问来源于stack exchange,提问作者sumitmx
相关产品推荐
相关产品推荐

