python执⾏shell脚本_在python脚本中执⾏shell命令的⽅法在python脚本中执⾏shell命令的⽅法
最近在写python的⼀些脚本,之前使⽤python都是在django中使⽤,可能⼤部分内容都是偏向于后端开发⽅⾯的,最近在写⼀些脚本的时候,发现了python的另外⼀种⾯貌,发现还挺有意思,分享⼀下,共⼤家参考。
使⽤Python处理⼀个shell命令或者⼀个执⾏⼀个shell脚本,⼀般情况下,有下⾯三种⽅法,下⾯我们来看:
第⼀种⽅法是使⽤os.system的⽅法
os.system("cmd")
我们在当前⽬录下⾯创建⼀个aaa.sql的⽂件,⽂件中的内容是aaa,然后我们来看测试过程1[root@ /data ]$python
2Python 2.7.15 (default, Nov 29 2018, 13:37:34)
3[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
4Type "help", "copyright", "credits" or "license" for more information.
5>>> import os
6>>> os.system('cat aaa.sql')
7aaa
80
9>>> os.system('cat bbb.sql')
10cat: bbb.sql: No such file or directory
11256
可以看到这个⽅法使⽤shell命令打印出来aaa.sql中的内容,然后下⾯出现的数字0代表上述命令执⾏成功;如果我们打印bbb.sql则返回值是256,表⽰执⾏中出现了问题。
shell脚本返回执行结果第⼆种⽅法是使⽤statusoutput()⽅法
我们来看测试结果:1[root@ /data]$python
2Python 2.7.15 (default, Nov 29 2018, 13:37:34)
3[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
4Type "help", "copyright", "credits" or "license" for more information.
5>>> import commands
6>>> statusoutput('pwd')
7(0, '/data')
8>>> statusoutput('pwddddd')
9(32512, 'sh: pwddddd: command not found')
10>>> exit()
当我们执⾏shell命令pwd的时候,statusputput返回值是0,也就是执⾏成功,返回结果是当前的⽬录;当执⾏pwddddd 的时候,由于不是系统命令,所以返回结果是command not found,返回值是32512
看到这⾥,可能⼤家有⼀个疑问,就是这两种⽅法都可以返回执⾏结果,它们有什么不同?看下⾯的测试1os的⽅法只能得到返回值,执⾏结果⽆法保存
2>>> import os
3>>> a=os.system('cat aaa.sql')
4aaa
5>>> print a
60
7>>> a,b=os.system('cat aaa.sql')
8aaa
9Traceback (most recent call last):
10 File "", line 1, in
11TypeError: 'int' object is not iterable
12
13commands的⽅法可以直接得到返回值和执⾏结果
14>>> import commands
15>>> statusoutput('cat aaa.sql')
16>>> print a
17(0, 'aaa')
18>>> a,statusoutput('cat aaa.sql')
19>>> print a
200
21>>> print b
22aaa
也就是说,statusoutput的⽅法,可以得到⼀个脚本或者⼀个命令的返回值和执⾏结果,当然,我们也可以使⽤下⾯的⽅法来分别校验aaa.sql⽂件是否存在,以及查看aaa.sql的执⾏结果:1[root@ /data]$python
2Python 2.7.15 (default, Nov 29 2018, 13:37:34)
3[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
4Type "help", "copyright", "credits" or "license" for more information.
5>>> utput('cat aaa.sql')
6'aaa'
7>>> status('aaa.sql')
8'-rw-r--r-- 1 root root 4 Dec 10 20:36 aaa.sql'
有了上⾯的基础,我们可以很⽅便的写出如下的代码,把脚本的执⾏结果和返回值进⾏保存,根据脚本执⾏的结果来确定最终的返回值:1cmd = "/bin/sh /data/scripts/test.sh %s" % para
2status, res = statusoutput(cmd)
3MYLOGGER.logger.info(status,res)
4MYLOGGER.logger.info("cmd do finished,result is [%s],[%s]" % (str(status),str(res)))
5if status == 0:
6 result["result"] = res.split('\n')[-1]
7else:
8 result["result"] = false
9 result["message"] = res
10return Response(result)
如果脚本中是对数据库的⼀系列操作,那么利⽤python和数据库进⾏交互也就⽔到渠成了。
第三种⽅法是使⽤popen函数
os.popen() 返回的是 file read 的对象,对其进⾏读取 read() 的操作可以看到执⾏的输出1[root@ /data]$python 2Python 2.7.15 (default, Nov 29 2018, 13:37:34)
3[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
4Type "help", "copyright", "credits" or "license" for more information.
5>>> import os
6>>> output = os.popen('cat aaa.sql')
7>>> ad()
8aaa
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论