应用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,表明实行中出現了难题。
第二种方式 是应用commands.getstatusoutput()方式
commands.getstatusoutput(“ cmd”)
大家看来检测結果:
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>>> commands.getstatusoutput('pwd') 7(0, '/data') 8>>> commands.getstatusoutput('pwddddd') 9(32512, 'sh: pwddddd: command not found') 10>>> exit()
在我们实行shell命令pwd的情况下,commands.getstatusputput传参是0,也就是实行取得成功,回到結果是目前的文件目录;当实行pwddddd的情况下,因为并不是DOS命令,因此回到結果是指令找不到,传参是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, in11TypeError: 'int' object is not iterable 12 13commands的方式 就可以立即获得传参和运行結果 14>>> import commands 15>>> a=commands.getstatusoutput('cat aaa.sql') 16>>> print a 17(0, 'aaa') 18>>> a,b=commands.getstatusoutput('cat aaa.sql') 19>>> print a 200 21>>> print b 22aaa
换句话说,commands.getstatusoutput的方式 ,能够收到一个脚本制作或一个指令的传参和运行結果,自然,大家还可以应用下边的办法来各自校正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>>> commands.getoutput('cat aaa.sql') 6'aaa' 7>>> commands.getstatus('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 = commands.getstatusoutput(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>>> print output.read() 8aaa