【问题标题】:How to create nice shell command wrapper in Python如何在 Python 中创建漂亮的 shell 命令包装器
【发布时间】:2015-10-01 14:04:10
【问题描述】:

我创建了特殊的元类,因此我可以使用第一个“动作”参数(没有破折号)为程序/命令提供很好的包装器。特别是 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/')

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

【问题讨论】:

  • 为什么要使用元类?请注意,如果这是您认为可以改进的工作代码,那么Code Review 可能会更好。

标签: python command subprocess wrapper metaclass


【解决方案1】:

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

【讨论】:

  • 我偶然发现了它。是的,但这有点矫枉过正,如果您不想使用外部库,我认为可能会有更好的选择。无论如何,感谢您指出!
【解决方案2】:

我也建议看看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'

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 2021-04-18
    • 2013-05-20
    • 2011-01-29
    • 2010-09-10
    • 2018-12-10
    • 2013-05-25
    • 2015-09-14
    相关资源
    最近更新 更多