隐藏 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"')

原文由 ArekBulski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.8k
2 个回答

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

抑制来自 os.system()所有 输出请将 >/dev/null 2>&1 附加到 shell 命令,这将使 stdout 和 stderr 静音;例如:

 import os
os.system('echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1')

请注意, os.system() 通过设计将调用进程的 stdout 和 stderr 流的输出 传递 到控制台(终端)——您的 Python 代码永远看不到它们。

此外, os.system() 如果 shell 命令失败,则 不会 引发异常,而是返回退出代码;请注意,提取 shell 命令的真正退出代码需要额外的工作:您需要通过应用 >> 8 从返回的 16 位值中提取高字节(尽管您可以依赖除 0 暗示错误情况)。


鉴于 os.system() 的上述限制, 通常值得使用 subprocess 模块中的功能

例如, subprocess.check_output() 可以按如下方式使用:

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

以上将:

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

注意: Python 3.5 引入了 subprocess.run() ,它是 os.system()subprocess.check_output() 的更灵活的继任者 --- 参见 https://on.orgs.py . subprocess.html#using-the-subprocess-module


笔记:

  • OP 首先使用 tee 的原因 - 尽管对标准输出输出不感兴趣 - 是天真的尝试使用 > ... 而不是在 sudo 之前 被解释 --- 被调用,因此失败,因为尚未授予写入 /proc/sys/... 所需的权限。
  • 无论您使用的是 os.system() 还是 subprocess 函数, stdin 默认情况下不受影响,因此如果您从终端调用脚本,您将获得交互式密码提示当遇到 sudo 命令时(除非凭证已被缓存)。

原文由 mklement0 发布,翻译遵循 CC BY-SA 4.0 许可协议

直接写入 proc 伪文件,而不是通过 Python i/o lib。

这将要求您的脚本以 root 身份运行(通过 sudo ),这意味着您应该将其范围限制为仅限管理员的工具。这也允许脚本在 sudo 需要密码的盒子上运行。

例子:

 with open("/proc/sys/vm/drop_caches", "w") as drop_caches:
    drop_caches.write("3")

原文由 Alastair McCormack 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题