隐藏os.system生成的控制台输出

我正在调用这段代码,但是它在我运行python脚本的控制台中产生了一些输出(由于tee命令):

os.system("echo 3 | sudo tee /proc/sys/vm/drop_caches")

此版本不产生控制台输出,但是还有另一种方法吗?

os.system('sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"')

回答:

要以最 通用的 形式根据其标题回答问题:

要 , ;例如:

import os

os.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.check_output()可以如下使用:

import subprocess

subprocess.check_output('echo 3 | sudo tee /proc/sys/vm/drop_caches', shell=True)

以上将:

  • 捕获 标准 输出并返回(在上面的示例中忽略了返回值)
  • 通过 stderr 输出;stderr=subprocess.STDOUT作为附加参数传递也将捕获stderr。
  • 如果shell命令失败,则会引发错误。

注:

推出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则遇到命令时会收到一个交互式密码提示(除非凭据已被缓存)。

以上是 隐藏os.system生成的控制台输出 的全部内容, 来源链接: utcz.com/qa/410726.html

回到顶部