我一直在使用sh模块主要执行Git命令。我遇到的问题是sh产生子shell来完成工作,并且std输出不会被定向到我的主Python脚本的输出。当然,对于每个sh.git调用,我可以执行以下操作,如下所示:
git = sh.git.bake(_cwd=repoPath)
print git.fetch().stdout
print git.log('-n=1', SHA).stdout
但我不想这样做。我想制作一个包装器,所以我可以在我的git调用中嵌入stdout打印功能,所以也许这样的东西但结果相同:
git = wrapper(sh.git.bake(_cwd=repoPath))
git.fetch()
git.log('-n=1', SHA)
我已经阅读过Python的函数装饰器,但我还没有弄明白。
答案 0 :(得分:1)
以下内容应该有效:
import functools
class wrapper(object):
def __init__(self, obj):
self.obj = obj
@staticmethod
def _print_stdout_deco(func):
@functools.wraps(func)
def print_stdout(*args, **kwargs):
print func(*args, **kwargs).stdout
return print_stdout
def __getattr__(self, name):
f = self._print_stdout_deco(getattr(self.obj, name))
setattr(self, name, f)
return f
这将创建一个包装对象,该对象将所有属性查找委托给传入的对象。当发生属性查找时,包装对象的属性将被装饰以执行打印到stdout然后返回。请注意,这假设包装对象的所有属性都是函数,我认为这是sh模块的有效假设,但我不完全确定。如果不是这种情况,您将需要检查getattr(self.obj, name)
的结果,如果它是一个函数,则只将其传递给装饰器。