我正在调用这段代码,但它在我运行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"')
vybvopom1#
要以最"通用"的形式根据标题回答问题:要**抑制 * 所有 * os.system()**的输出,请将>/dev/null 2>&1附加到shell命令,这将同时禁用stdout和stderr;例如:
os.system()
>/dev/null 2>&1
import os os.system('echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1')
注意,os.system()在设计上将调用进程的stdout和stderr流的输出 * 通过 * 传递到控制台(终端)--Python代码永远看不到它们。此外,如果shell命令失败,os.system()不会引发异常,而是返回一个退出代码;注意,提取shell命令的真正退出代码需要额外的工作:您需要通过应用>> 8从返回的16位值中提取高位字节(尽管您可以依赖0以外的返回值,该值暗示错误条件)。考虑到os.system()的上述限制,通常值得使用subprocess模块中的函数:例如,subprocess.check_output()可以按如下方式使用:
>> 8
0
subprocess
subprocess.check_output()
import subprocess subprocess.check_output('echo 3 | sudo tee /proc/sys/vm/drop_caches', shell=True)
上述机构将:
stderr=subprocess.STDOUT
注意:Python 3.5引入了subprocess.run(),它是os.system()和subprocess.check_output()的更灵活的继承者-请参见www.example.comhttps://docs.python.org/3.5/library/subprocess.html#using-the-subprocess-module注:
subprocess.run()
tee
> ...
sudo
/proc/sys/...
57hvy0tb2#
直接写入proc伪文件,而不是通过Python i/o lib。这将要求您的脚本以root身份运行(通过sudo),这意味着您应该将其范围限制为仅管理员工具。这也允许脚本在sudo需要密码的设备上运行。示例:
with open("/proc/sys/vm/drop_caches", "w") as drop_caches: drop_caches.write("3")
zc0qhyus3#
subprocess.check_call(command,stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
你忘了加stderr了。
ufj5ltwl4#
你也可以使用这个简单的方法来实现子流程模块。
command = 'echo 3 | sudo tee /proc/sys/vm/drop_caches' subprocess.check_call(shlex.split(command),stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
所有输出将被传递给DEVNULL。命令的任何问题都将被报告为异常。没有问题意味着没有输出。
rks48beu5#
我相信,当os.system无法隐藏控制台输出时,最简单的方法就是使用os.popen:
os.system
os.popen
os.popen("echo 3 | sudo tee /proc/sys/vm/drop_caches")
5条答案
按热度按时间vybvopom1#
要以最"通用"的形式根据标题回答问题:
要**抑制 * 所有 *
os.system()
**的输出,请将>/dev/null 2>&1
附加到shell命令,这将同时禁用stdout和stderr;例如:注意,
os.system()
在设计上将调用进程的stdout和stderr流的输出 * 通过 * 传递到控制台(终端)--Python代码永远看不到它们。此外,如果shell命令失败,
os.system()
不会引发异常,而是返回一个退出代码;注意,提取shell命令的真正退出代码需要额外的工作:您需要通过应用>> 8
从返回的16位值中提取高位字节(尽管您可以依赖0
以外的返回值,该值暗示错误条件)。考虑到
os.system()
的上述限制,通常值得使用subprocess
模块中的函数:例如,
subprocess.check_output()
可以按如下方式使用:上述机构将:
stderr=subprocess.STDOUT
作为附加参数也将捕获stderr。注意:Python 3.5引入了
subprocess.run()
,它是os.system()
和subprocess.check_output()
的更灵活的继承者-请参见www.example.comhttps://docs.python.org/3.5/library/subprocess.html#using-the-subprocess-module注:
tee
的原因--尽管对stdout输出不感兴趣--是因为使用> ...
的天真尝试会在调用sudo
之前 * 被解释,因此失败,因为写入/proc/sys/...
所需的特权还没有被授予。os.system()
还是subprocess
函数,* stdin * 在默认情况下都不受影响,因此如果您从终端调用脚本,当遇到sudo
命令时,您将得到一个交互式密码提示(除非凭据已缓存)。57hvy0tb2#
直接写入proc伪文件,而不是通过Python i/o lib。
这将要求您的脚本以root身份运行(通过
sudo
),这意味着您应该将其范围限制为仅管理员工具。这也允许脚本在sudo
需要密码的设备上运行。示例:
zc0qhyus3#
你忘了加stderr了。
ufj5ltwl4#
你也可以使用这个简单的方法来实现子流程模块。
所有输出将被传递给DEVNULL。命令的任何问题都将被报告为异常。没有问题意味着没有输出。
rks48beu5#
我相信,当
os.system
无法隐藏控制台输出时,最简单的方法就是使用os.popen
: