如何在Python中屏蔽os.system调用bash脚本的输出?
问题:屏蔽Python调用外部bash脚本的输出
我正在用Python的os.system运行bash脚本,但这个脚本会向控制台输出大量内容导致刷屏。需要仅保留Python自身的打印内容(示例中的text1和text2),且无法修改bash脚本,如何实现?
示例代码
bash脚本(blue.sh)
#!/bin/bash touch "SomeFile.dat" echo "Spam Spam Spam Spam" echo "Spam Spam Spam Spam" echo "Spam Spam Spam Spam" echo "Spam Spam Spam Spam"
原Python代码
import os print("Job starting") #text1 os.system("./blue.sh") print("Job finished") #text2
解决方案
方法1:通过shell重定向屏蔽输出(基于os.system)
直接在os.system的命令后添加输出重定向,将标准输出和错误输出都导向系统空设备/dev/null:
import os print("Job starting") #text1 # 将stdout和stderr都重定向到/dev/null os.system("./blue.sh > /dev/null 2>&1") print("Job finished") #text2
- 说明:
> /dev/null丢弃标准输出(stdout),2>&1将标准错误(stderr)重定向到和标准输出相同的位置,实现所有输出屏蔽。
方法2:使用subprocess模块(官方推荐)
Python官方推荐用subprocess替代os.system,它能更灵活地控制外部进程的输入输出:
import subprocess print("Job starting") #text1 # 丢弃stdout和stderr subprocess.run(["./blue.sh"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) print("Job finished") #text2
如果需要兼容Python 3.6之前的版本,可使用subprocess.call:
import subprocess print("Job starting") #text1 subprocess.call(["./blue.sh"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) print("Job finished") #text2
- 说明:
subprocess.DEVNULL等价于系统的/dev/null,直接丢弃对应输出;使用列表形式的命令参数无需依赖shell,更安全(避免潜在的shell注入风险)。
内容的提问来源于stack exchange,提问作者brownser
相关产品推荐
相关产品推荐

