Python 隐藏操作系统生成的控制台输出

Python 隐藏操作系统生成的控制台输出,python,shell,Python,Shell,我正在调用这段代码,但它会在我运行python脚本的控制台中生成一些输出(由于tee命令): 这个版本不产生控制台输出,但还有其他方法吗 os.system('sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"') 直接写入proc伪文件,而不是通过Python i/o库 这将要求您的脚本以root身份运行(通过sudo),这意味着您应该将其范围限制为仅限管理员使用的工具。这还允许脚本在sudo需要密码的框上运行 例如: with open(

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

这个版本不产生控制台输出,但还有其他方法吗

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

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

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

例如:

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

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

抑制来自
os.system()
的所有输出,
/dev/null 2>&1
附加到shell命令,该命令将使stdout和stderr都静音
;e、 g:

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

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


鉴于
os.system()
的上述限制,通常值得使用
子流程
模块
中的函数:

例如,
subprocess.check\u output()
可以按如下方式使用:

import subprocess
subprocess.check_output('echo 3 | sudo tee /proc/sys/vm/drop_caches', shell=True) 
上述措施将:

  • 捕获标准输出并返回它(在上面的示例中忽略返回值)
  • 通过stderr输出;将stderr=subprocess.STDOUT作为附加参数传递也会捕获stderr
  • 如果shell命令失败,则引发错误
注意:Python3.5引入了
子流程.run()
,它是
os.system()
子流程的更灵活的继承者。检查输出()


注:

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

    • 您也可以使用子流程模块的这种简单方法

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

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

      我不认为将整个脚本作为root来运行。Petesh,如果脚本需要root权限运行,那么用户必须了解风险。在系统上,
      sudo
      需要密码,OP的原始脚本将失败。要求用户
      sudo
      my code,这会使风险和意图非常明显。Petesh,我们讨论的脚本已经要求sudo调用命令。您的观点与此无关。
      open(“/proc/sys/vm/drop\u caches”,“w”)。write(“3”)
      也可以接受
      command = 'echo 3 | sudo tee /proc/sys/vm/drop_caches'
      subprocess.check_call(shlex.split(command),stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL)