要以最 通用的 形式根据其标题回答问题:
要 取消 所有 来自的输出os.system()
, 请在shell命令后 追加>/dev/null2>&1
,该命令将同时关闭stdout和stderr;例如:
import osos.system('echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1')需要注意的是
os.system()通过设计通过输出 通过 给调用进程的输出和错误流- Python代码永远看不到它们。
另外,如果shell命令失败并返回退出代码,
os.system()则 不会
引发异常;请注意,提取shell命令的真实退出代码需要花费额外的工作:您需要通过应用从返回的16位值中提取高字节
>>8(尽管您可以依赖返回值,而不是
0暗示错误条件)。
鉴于的上述限制
os.system(), 通常值得使用
subprocess模块中的函数代替:
例如,
subprocess.check_output()可以如下使用:
import subprocesssubprocess.check_output('echo 3 | sudo tee /proc/sys/vm/drop_caches', shell=True)以上将:
- 捕获 标准 输出并返回(在上面的示例中忽略了返回值)
- 通过 stderr 输出;
stderr=subprocess.STDOUT
作为附加参数传递也将捕获stderr。 - 如果shell命令失败,则会引发错误。
注: Python的3.5
推出
subprocess.run(),更灵活的继任者都
os.system()和
subprocess.check_output()-看到https://docs.python.org/3.5/library/subprocess.html#using-
the-subprocess-
module
注意:
- OP首先使用的原因
tee
-尽管对stdout输出不感兴趣-是因为天真的尝试使用它> ...
会 在sudo
调用 之前 被解释,因此失败,因为/proc/sys/...
尚未获得所需的写入特权授予了。 - 无论使用的
os.system()
是subprocess
函数还是函数, stdin 默认情况下都不会受到影响,因此,如果您从终端调用脚本,sudo
则遇到命令时会收到一个交互式密码提示(除非凭据已被缓存)。



