我正在使用 Python 库Fabric进行一些远程服务器维护。Fabric 自动输出对远程和本地命令的所有响应,除非您将命令包装在一对 with 语句中。像这样,在本地机器上,
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = local("uname -a", True)
或者在远程机器上这样:
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = run("uname -a")
我正在写一个漫长而复杂的任务,发现自己一遍又一遍地重复着这两个陈述。我想编写一个名为 _mute() 的函数来防止这种重复。它会让我做这样的事情:
def _mute(fabric_cmd, args):
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = fabric_cmd(args)
return output
def some_remote_task():
# Run a remote task silently
_mute(remote, 'uname -a')
def some_local_task():
# Run a local task silently
_mute(local, 'uname -a', True)
我研究了一些解决方案,并且知道“eval”可以为我做到这一点。但是我读到的关于 eval 的每一页都表明,由于安全问题,它几乎总是一个坏主意。我研究了部分,但我不知道如何在我的 _mute 函数中创建一个可调用的参数。我猜这里缺少一个更高级别的 Python 概念。这样做的pythonic方法是什么?感谢您提供的任何方向。