Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中创建漂亮的shell命令包装器_Python_Command_Subprocess_Wrapper_Metaclass - Fatal编程技术网

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

如何在Python中创建漂亮的shell命令包装器,python,command,subprocess,wrapper,metaclass,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

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

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

这不是对你问题的直接回答,但你已经看过了吗?在我看来,这正是你想要的。即使不是,它也是开源的,您可以看看他们是如何完成任务的。
尤其是
Command
RunningCommand
类,您可以在它们的

我还建议您看看


为什么要使用元类呢?请注意,如果这是您认为可以改进的工作代码,那么它可能会更好。我偶然发现了它。是的,但这有点过头了,如果您不想使用外部库,我认为可能会有更好的选择。无论如何,谢谢你的指点!
>>> 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'