如何在Python中创建漂亮的shell命令包装器
我创建了一个特殊的元类,这样我就可以用第一个'action'参数(不带破折号)为程序/命令创建一个漂亮的包装器。特别是svn、git等。我不想为此使用外部工具如何在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
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'