繁体   English   中英

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

[英]Hiding console output produced by 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"')

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

抑制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 命令的真正退出代码需要额外的工作:您需要通过应用>> 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-子流程模块


笔记:

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

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

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

例子:

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

您也可以使用 subprocess 模块的这种简单方法。

command = 'echo 3 | sudo tee /proc/sys/vm/drop_caches'
subprocess.check_call(shlex.split(command),stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL)

所有输出都将传递给 DEVNULL。 命令的任何问题都将报告为异常。 没有问题意味着没有输出。

问题未解决?试试以下方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM