Python和Shell交互是系统管理员绕不过去的坎儿。一般来说,我们会通过Subprocess、Popen或者Command模块执行一条Shell命令或脚本,然后通过返回的标准输出和错误输出来得到结果。这是很教科书的做法,可行但不直观。Pythoner的价值观都是不仅要可行,还要简单直观才好。那有没有一种办法让Python和Shell的代码能够简单直观地融合在一起,各自发挥所长,出色地完成任务?
有,因为Shell和Python在助产婆lamerman的帮助下,生了一个娃,叫shellpy。这个小家伙能够实现我们想要的功能。(姓跟了shell,看来shell是爸爸,python是妈妈啊~)
项目地址
https://github.com/lamerman/shellpy
使用方法
shellpy的主体是Python,毕竟Python是一门完整的通用语言,而Shell不是。就是说,总体的编码和Python是一样的,想要嵌入Shell命令的时候,在命令前面加一个 ` (Tab上面那个键,一个右点号)。像这样`ls -l`
或者这样`ls -l
也可以写多行命令`echo test > test.txtcat test.txt`
或者一个很长的行`echo This is \ a very long \ line
不可缺少的,你也可以获得命令的返回result = `ls -l
这个结果是一个Result类型或者InteractiveResult类型。我们先从简单的Result开始讲起。你可以这样获取到一个命令的返回码result = `ls -lprint result.returncode
这样获取标准输入输出的文本result = `ls -lresult_text = result.stdoutresult_error = result.stderr
或者逐行遍历标准输出的文本result = `ls -lfor line in result: print line.upper()
等等。
语法糖
也会有一些语法糖,比如空值判断的语法糖:result = `ls -lif result: print 'Return code for ls -l was 0'
然后是获取标准输出的语法糖result = `ls -lprint result
与Python代码集成,以及代码重用
一个shellpy文件内容如下:import os.path`mkdir /tmp/mydiros.path.exists('/tmp/mydir') # True
这很好理解,主体是Python,嵌入shell代码。需要注意的是,这个文件的扩展名不是.py,而是.spy。
shellpy还有包的概念,包的概念和python包的概念是完全一样的,结构如下:ls common/common.spy __init__.spy
唯一的区别就是.py都变成了.spy。这样的包还能够直接被Python引用,就像这样:from common.common import common_func是不是很神奇?