python-sh
sh模块
基本使用
直接使用命令对应的函数
如:print(sh.ls("/"))
- 命令参数分别以函数参数的形式给出
如:tar("cvf", "/tmp/test.tar", "/my/home/directory/")
即执行linux命令tar -cvf /tmp/test.tar /my/home/directory/
- 命令名中如果出现横线
-
则其对应的函数名应改为下划线_
如: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
为例
- 以关键词参数的形式给出
sh.curl("http://duckduckgo.com/", o="page.html", silent=True)
- 以分割的字符串的形式给出
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
为例
- 使用命令函数下的对应子函数
sh.sudo.ls("/root")
- 将子命令作为参数给出
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
进阶使用
暂略……