隐藏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"')
回答:
要以最 通用的 形式根据其标题回答问题:
要 , ;例如:
import osos.system('echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1')
需要注意的是os.system()
通过设计通过输出 通过 给调用进程的输出和错误流- Python代码永远看不到它们。
另外,如果shell命令失败并返回退出代码,os.system()
则 不会
引发异常;请注意,提取shell命令的真实退出代码需要花费额外的工作:您需要通过应用从返回的16位值中提取高字节>>
8(尽管您可以依赖返回值,而不是0
暗示错误条件)。
鉴于的上述限制os.system()
, 代替:
例如,subprocess.check_output()
可以如下使用:
import subprocesssubprocess.check_output('echo 3 | sudo tee /proc/sys/vm/drop_caches', shell=True)
以上将:
- 捕获 标准 输出并返回(在上面的示例中忽略了返回值)
- 通过 stderr 输出;
stderr=subprocess.STDOUT
作为附加参数传递也将捕获stderr。 - 如果shell命令失败,则会引发错误。
注:
推出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
则遇到命令时会收到一个交互式密码提示(除非凭据已被缓存)。
以上是 隐藏os.system生成的控制台输出 的全部内容, 来源链接: utcz.com/qa/410726.html