shell和Python生娃了!太牛了!

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
是不是很神奇?

                                                                                                                                                                                                                           


 

2月15日11:00到13:00网站停机维护,13:00前恢复