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

时间:2015-11-29 17:41:38

标签: python shell

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

3 个答案:

答案 0 :(得分:8)

要根据大多数通用形式的标题回答问题:

禁止<{1}} 所有输出,os.system()附加到shell命令,这会使stdout和stderr静音; e.g:

>/dev/null 2>&1

请注意,import os os.system('echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1') 按设计将输出通过传递给调用进程'stdout和stderr流 - 您的Python代码永远不会看到它们。

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

鉴于>> 8的上述限制,通常值得使用0模块中的函数:

例如,os.system()可以按如下方式使用:

subprocess

以上将:

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

注意: Python 3.5 引入了import subprocess subprocess.check_output('echo 3 | sudo tee /proc/sys/vm/drop_caches', shell=True) ,这是stderr=subprocess.STDOUTsubprocess.run()更灵活的继任者 - 请参阅https://docs.python.org/3.5/library/subprocess.html#using-the-subprocess-module

注意:

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

答案 1 :(得分:3)

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

这将要求您的脚本以root身份运行(通过....,line 18, in <module> total_of += (v - average[v])**2 TypeError: 'float' object is not subscriptable ),这意味着您应该将其范围限制为仅限管理员的工具。这也允许脚本在sudo需要密码的框上运行。

示例:

sudo

答案 2 :(得分:0)

您还可以使用此子过程模块的简单方法。

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

所有输出将传递到DEVNULL。该命令的任何问题将通过异常报告。没有问题就意味着没有输出。