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

问题描述 投票:0回答:2

我创建了特殊的元类,这样我就可以为带有第一个“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/')

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

python command subprocess wrapper metaclass
2个回答
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'

1
投票

您考虑过使用sh吗?我想这正是你想要的。如果没有,看看他们如何包装 shell 命令。

Command
RunningCommand
类(请参阅
sh
存储库)可能很有用。

© www.soinside.com 2019 - 2024. All rights reserved.