python-sh

Author Avatar
YaHei 9月 20, 2015

sh模块

sh官方文档

基本使用

直接使用命令对应的函数

如:print(sh.ls("/"))

  1. 命令参数分别以函数参数的形式给出
    如:tar("cvf", "/tmp/test.tar", "/my/home/directory/")
    即执行linux命令tar -cvf /tmp/test.tar /my/home/directory/
  2. 命令名中如果出现横线-则其对应的函数名应改为下划线_
    如:linux命令google-chrome对应函数google_chrome

自定义命令函数

如:

    lscmd = sh.Command("/bin/ls -l")  
    lscmd("/")

即将带参数linux命令/bin/ls -l“封装”成lscmd()

提供参数的两种形式

以linux命令curl http://duckduckgo.com/ -o page.html --silent为例

  1. 以关键词参数的形式给出
    sh.curl("http://duckduckgo.com/", o="page.html", silent=True)
  2. 以分割的字符串的形式给出
    sh.curl("http://duckduckgo.com/", "-o", "page.html", "--silent")

后台运行

命令默认前台运行(阻塞式,block),如果将命令转至后台(非阻塞式,doesn’t block),添加关键词参数_bg=True即可
如:sh.sleep(3, _bg=True)

管道

使用linux中的管道命令,直接用函数的嵌套调用即可
如:sh.wc( sh.ls("/etc", "-l"), "-l" )
即linux命令ls /etc -l | wc -l

默认情况下,被传递的命令完成后才会传递给管道命令
如上例中ls完成后才会传递并执行wc命令

给被传递的命令函数加入参数_piped=True后,可以使两个命令同时执行,被传递的命令不断得将新产生的返回信息传递给管道命令
如上例中不等ls完成即会传递并执行wc命令,ls不断产生新的信息并不断传递给wc命令

数据流重定向

使用参数_out={filename}_err={filename}分别将标准输出和错误输出重定向到指定文件中
如果文件已存在,默认将清空文件内容后重新写入
如:sh.ls(_out="files.list")

标准输入stdin

可以给一个命令函数提供标准输入
只需要提供参数_in={stdin}即可
如:print( sh.cat(_in="hello") )
“stdin”不仅可以是字符串,还可以是文件、队列和任何可迭代对象(列表、集合、字典等)

子命令的两种形式

以linux命令sudo ls /root为例

  1. 使用命令函数下的对应子函数
    sh.sudo.ls("/root")
  2. 将子命令作为参数给出
    sh.sudo( "ls", "/root" )

注意:对于sudo命令,用户必须设置NOPASSWD选项使该用户在命令执行时无需再输入密码才能正常执行

命令回传值的接收与处理

命令函数的返回内容除了其应有的输出,还包含exit_code属性记录命令的回传值(一般正常执行的回传值为0)
如:
print(sh.ls("/root"))打印ls命令的输出
print(sh.ls("/root").exit_code)打印ls命令的回传值

  • 命令执行失败会引起python出现相应的异常,可以借助python的try/except机制捕获并处理异常
    回传值为x的命令错误会触发ErrorReturnCode_x的异常
    如:回传值为2的命令错误会触发ErrorReturnCode_2的异常
  • 有些命令即使正常执行也会报错,可以在调用相应的函数时给出ok_code={ok_code_list}参数来告知哪些回传值是正常的
    如:sh.weird_program(_ok_code=[0,3,5])

通配符的使用

将使用通配符的字符串用sh.glob()函数处理(注意不是glob.glob()函数
如:
sh.ls( sh.glob("*.py") )
即linux命令ls *.py

进阶使用

暂略……