我创建了特殊的元类,所以我可以使用第一个'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/')
可以做得更好吗?或者你认为它是滥用元类?告诉我。
答案 0 :(得分:1)
所以这不是你问题的直接答案,但你已经看过sh了吗?在我看来,它正是做你想要的。即使不是,它也是开源的,你可以看看它们是如何完成任务的。
特别是您可以在github repository中找到的Command
和RunningCommand
类可能对您有用。
答案 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'