Python脚本执行shell的一个小问题

原创 DBA随笔 DBA随笔 1周前收录于话题#Python学习笔记29个

//Python脚本执行shell的一个小问题//     在python脚本中执行shell命令,可能是平常写脚本过程中比较常见的一种场景,这两天在写程序的时候发现一个问题,这里分享一下。01常用的commands模块     就是写python的时候,如果执行了一个命令,我们想知道它的返回,一般是可以通过commands这个模块来处理的,我比较习惯使用的是commands.getstatusoutput,来看个例子:-----代码片段-----import commandsimport datetimestart_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')print 'start_time is: {}'.format(start_time)status,result = commands.getstatusoutput('sleep 10')print "status is {0},result is {1}".format(status,result)end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')print 'end_time is: {}'.format(end_time)--------结果------start_time is: 2021-03-07 23:24:32status is 0,result isend_time is: 2021-03-07 23:24:42上面的例子中,我们执行了一个sleep 10的shell操作。将执行的状态保存在status变量中,将执行结果保存在result变量中。结果中可以看到status返回0,而result返回空值。我们脚本执行的开始时间start_time和脚本的最后输出时间end_time中间,有10s的时间差。如果我们有一个shell命令,需要执行很久,例如1个小时,这个时候,如果我们用commands.getstatusoutput模块的话,只能等这个python脚本执行完,才能得到shell脚本最终的执行结果。因为执行的时间很长,所以有时候我们想要查询执行的中间状态来确保当前程序依旧在执行中,而不是挂掉了。commands.getstatusoutput是不能查看命令执行的中间状态的。02如何查看shell命令中间状态?    这里我们需要引入另外一个模块,subpress模块,这个模块中有一个类Popen,可以查看当前命令执行过程中间的状态,如下:-----代码片段----import subprocessimport datetimeimport timeproc = subprocess.Popen("sleep 10",shell=True, stdout=subprocess.PIPE)print "proc is {}".format(proc)time.sleep(5)print '5s result is : {}'.format(proc.poll())time.sleep(10)print '10s tmp result is : {}'.format(proc.poll())----执行结果-----proc is <subprocess.Popen object at 0x7faff43f0e10>5s result is : None10s tmp result is : 0可以看到,我们引用subpress模块的Popen类来执行sleep 10这个shell命令。这个Popen类还包含一个poll的函数,来查看当前命令的返回值。如上述结果:5s的时候,输出的结果是None,代表sleep 10还在执行中;10s的时候,输出的结果是0,代表sleep 10执行成功。这样就可以捕捉命令的执行中间过程,我们完全可以写一个while 1的循环,等待某个命令的返回值为0,在开始执行后面的命令。还可以将执行的中间结果打印到屏幕上,避免执行命令的时候,完全是一个黑盒状态。这个Popen类中还有其他很有用的函数,这里简要介绍,有需求可以去研究下:Popen.poll()用于检查子进程(命令)是否已经执行结束,没结束返回None,结束后返回状态码。Popen.wait(timeout=None)等待子进程结束,并返回状态码;如果在timeout指定的秒数之后进程还没有结束,将会抛出一个TimeoutExpired异常。Popen.communicate(input=None, timeout=None)该方法可用来与进程进行交互,比如发送数据到stdin,从stdout和stderr读取数据,直到到达文件末尾。Popen.send_signal(signal)发送指定的信号给这个子进程。Popen.terminate()停止该子进程。Popen.kill()杀死该子进程。

有帮助的话还希望点下再看哈收录于话题 #Python学习笔记29个上一篇Python异常处理:让你的程序更稳定下一篇Python异步调用函数喜欢此内容的人还喜欢Python异常处理:让你的程序更稳定Python异常处理:让你的程序更稳定...DBA随笔不喜欢不看的原因确定内容质量低不看此公众号Python中的匿名函数Python中的匿名函数...DBA随笔不喜欢不看的原因确定内容质量低不看此公众号又一个Jupyter神器,操作Excel自动生成Python代码!又一个Jupyter神器,操作Excel自动生成Python代码!...法纳斯特不喜欢不看的原因确定内容质量低不看此公众号

(0)

相关推荐

  • [638]python os.popen() 方法

    概述 os.popen() 方法用于从一个命令打开一个管道. 在Unix,Windows中有效 语法 popen()方法语法格式如下: os.popen(command[, mode[, bufsiz ...

  • Shell脚本执行有哪些方式?Linux技能分享

    Shell编程是Linux运维必须要掌握的知识技能.学好Shell脚本语言,能够更灵活的应用操作Linux系统.Linux系统学习知识中,Shell脚本执行有哪些方式? Shell脚本执行有哪些方式? ...

  • Linux Shell 计算脚本执行过程用了多长时间

    #!/bin/bash starttime=`date +'%Y-%m-%d %H:%M:%S'` #执行程序 endtime=`date +'%Y-%m-%d %H:%M:%S'` start_se ...

  • jenkins 执行shell脚本 暂存脚本至自定义变量

    三个地方需要注意: sum 与 = 号之间不能有空格 后面shell表达式必须要用 `` 符号包裹起来 要获取定义的sum变量 必须要使用 $ 符号

  • 花10分钟写一个Python脚本,搞定了初中老师一下午的工作

    有个朋友是一个初中老师.嗯,教学行政两手抓的那种初中老师. 一天晚上突然微信问我,怎么把图片转成PDF.懵了一下,这个直接打印成PDF不就可以了? 遂告诉他,结果感觉两个人不是一个世界的: 好不容易教 ...

  • 执行shell脚本的四种方式(转)

    原文网址:https://www.jb51.net/article/53924.htm 这篇文章主要介绍了Linux中执行shell脚本的4种方法,即总结在Linux中运行shell脚本的4种方法. ...

  • odoo12 centos执行shell脚本监测服务状态崩溃重启

    原因:由于其他原因,或者odoo内部服务自动停止掉,需要一个脚本来监测状态,自动启动. 步骤: 1.在任意目录下新建shell脚本odoodaemon.sh 1 #!/bin/sh 2 # ckcon ...

  • 如何在python中执行另一个py文件

      更新时间:2020年04月30日 10:24:22   作者:杰鑫哥   这篇文章主要介绍了如何在python中执行另一个py文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参 ...

  • 一个小破网站,居然比 Python 官网还牛逼

    Python爱好者社区 2021-10-01 以下文章来源于Python编程时光 ,作者写代码的明哥 大家好,我是明哥哥~ 前两天,我发现有个前同事写的 Shell 脚本经常在出问题,考虑这个脚本一直 ...

  • 用 python 写一个小游戏

    今天玩点别的吧 都说 Python 除了生孩子 什么都能干 咱们今天 就用 Python 写个小游戏 贪吃蛇 想必大家都玩过这玩意 有没有想过 你自己来实现一个这样的游戏呢 那么接下来就是 学习 py ...