gpt4 book ai didi

python - 隐藏 os.system 产生的控制台输出

转载 作者:太空狗 更新时间:2023-10-29 20:51:32 38 4
gpt4 key购买 nike

我正在调用这段代码,但它在我运行 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"')

最佳答案

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

抑制所有 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 代码永远不会看到他们。

此外,如果 shell 命令失败,os.system() 不会引发异常,而是返回退出代码;请注意,提取 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://docs.python.org/3.5/library/subprocess.html#using-the-subprocess-module


注意:

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

关于python - 隐藏 os.system 产生的控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33985863/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com