为python的sh做一个不寻常的包装器

时间:2014-03-06 19:06:28

标签: python sh

我一直在使用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的函数装饰器,但我还没有弄明白。

1 个答案:

答案 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)的结果,如果它是一个函数,则只将其传递给装饰器。