前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在python脚本中执行shell命令的方法

在python脚本中执行shell命令的方法

作者头像
AsiaYe
发布2019-12-18 16:35:53
5.2K0
发布2019-12-18 16:35:53
举报
文章被收录于专栏:DBA随笔DBA随笔

在python脚本中执行shell命令的方法

最近在写python的一些脚本,之前使用python都是在django中使用,可能大部分内容都是偏向于后端开发方面的,最近在写一些脚本的时候,发现了python的另外一种面貌,发现还挺有意思,分享一下,共大家参考。

使用Python处理一个shell命令或者一个执行一个shell脚本,一般情况下,有下面三种方法,下面我们来看:

第一种方法是使用os.system的方法

os.system("cmd")

我们在当前目录下面创建一个aaa.sql的文件,文件中的内容是aaa,然后我们来看测试过程

代码语言:javascript
复制
 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")

我们来看测试结果:

代码语言:javascript
复制
 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的时候,由于不是系统命令,所以返回结果是command not found,返回值是32512

看到这里,可能大家有一个疑问,就是这两种方法都可以返回执行结果,它们有什么不同?看下面的测试

代码语言:javascript
复制
 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 "<stdin>", line 1, in <module>
11TypeError: '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的执行结果:

代码语言:javascript
复制
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'

有了上面的基础,我们可以很方便的写出如下的代码,把脚本的执行结果和返回值进行保存,根据脚本执行的结果来确定最终的返回值:

代码语言:javascript
复制
 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() 的操作可以看到执行的输出

代码语言:javascript
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档