如何在Python中创建漂亮的shell命令包装器

时间:2015-10-01 14:04:10

标签: python command subprocess wrapper metaclass

我创建了特殊的元类,所以我可以使用第一个'action'参数(没有破折号)为程序/命令提供好的包装。特别是svn,git等。我不想为此目的使用外部工具。

  import subprocess

  class CmdWrap(type):

      def __new__(mcs, name, bases=(object,), dict={}):
          dict['name'] = name
          return type.__new__(mcs, name, bases, dict)

      def __getattr__(self, name):
          def run_cmd(*args, **kwds):
              cmd = (self.name, name) + args
              process = subprocess.Popen(cmd,
                                         stdout=subprocess.PIPE,
                                         stderr=subprocess.PIPE,
                                         cwd=None)
              out = process.communicate()

              if process.returncode != 0:
                  raise Exception(cmd, process.returncode, out)
              else:
                  return out

          if name in self.__dict__:
              return self.__dict__['name']
          else:
              return run_cmd
你怎么看?宁愿运行你最喜欢的命令:

svn = CmdWrap('svn')
svn.ls('http://your_repository/')

可以做得更好吗?或者你认为它是滥用元类?告诉我。

2 个答案:

答案 0 :(得分:1)

所以这不是你问题的直接答案,但你已经看过sh了吗?在我看来,它正是做你想要的。即使不是,它也是开源的,你可以看看它们是如何完成任务的。 特别是您可以在github repository中找到的CommandRunningCommand类可能对您有用。

答案 1 :(得分:1)

我还建议您查看Plumbum

>>> chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]
>>> print chain
/bin/ls -a | /bin/grep -v '\.py' | /usr/bin/wc -l
>>> chain()
u'13\n'