[英]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)
以上将:
stderr=subprocess.STDOUT
作为附加参数传递也将捕获 stderr。 注:Python的3.5推出subprocess.run()
更灵活的继任者都os.system()
和subprocess.check_output()
-见https://docs.python.org/3.5/library/subprocess.html#using-子流程模块
笔记:
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。 命令的任何问题都将报告为异常。 没有问题意味着没有输出。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.