前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python脚本执行shell的一个小问题

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

作者头像
AsiaYe
发布于 2021-03-13 14:07:21
发布于 2021-03-13 14:07:21
2K00
代码可运行
举报
文章被收录于专栏:DBA随笔DBA随笔
运行总次数:0
代码可运行

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

python脚本中执行shell命令,可能是平常写脚本过程中比较常见的一种场景,这两天在写程序的时候发现一个问题,这里分享一下。

01 常用的commands模块

就是写python的时候,如果执行了一个命令,我们想知道它的返回,一般是可以通过commands这个模块来处理的,我比较习惯使用的是commands.getstatusoutput,来看个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-----代码片段-----
import commands
import datetime


start_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:32
status is 0,result is 
end_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,可以查看当前命令执行过程中间的状态,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-----代码片段----
import subprocess
import datetime
import time

proc = 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 : None
10s 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()

杀死该子进程。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python调用外部命令的四种方式
python提供了几种调用shell的命令,但是每个命令的功能不同,需要详细了解下,才可以比较方便的来应对不同的需求。
陈晨135
2022/01/06
9680
python调用外部命令的四种方式
Python调用Shell命令–总有一款适合你
#!/usr/bin/python # -*- coding: utf-8 -*- import os import commands import subprocess # content = os.system('ls -al') #执行结果 0或者1 # print '结果:%s' % content # content = os.popen('ls -al').read() # print '###结果:%s' % content # content = os.popen('ls -al').re
苦咖啡
2018/04/28
8020
Python调用shell命令常用方法
方法一、使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256表示未找到,该方法适用于shell命令不需要输出内容的场景。
用户7639835
2021/08/26
1K0
python执行系统命令的方法
    做为系统工程师来说,经常会用到python脚本去调用一下系统命令,现把经常使用的集中调用方法总结如下:
py3study
2020/01/07
3.9K0
python之路day5
铺垫: 1、os模块 os模块中的system,使用os.system("dir")可直接输出结果,如果将os.system("dir")赋值给一个变量,则这个变量接收的是这个命令执行成功与否,如果非0则执行不成功,0表示执行成功。 a=os.popen("dir").read()会保存命令输出结果,并赋值给a,此时print(a)就可以输出到屏幕 2、commands模块:只使用于linux
py3study
2020/01/09
6480
讲讲如何让shell执行python命令的两种实用方法
commands对Python的os.popen()进行了封装,使用SHELL命令字符串作为其参数,返回命令的结果数据以及命令执行的状态;
菜鸟站长之家
2021/02/06
9170
Python中执行系统命令常见的几种方法
   这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息。
一朵灼灼华
2022/08/05
4690
python之commands模块(执行
用于执行Linux shell命令,要获得shell命令的输出只需要在后面参数写入('命令')就可以了。
py3study
2020/01/09
1.6K0
Python执行系统命令四种方法分类目录文章标签友情链接联系我们
一、os.system方法 os.system(cmd) 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态 >>> import os >>> os.system('date')
用户1246209
2018/06/27
6380
Python模块学习:subprocess模块详解
subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码。这个模块的目的在于替换几个旧的模块和方法,如:
Python学习者
2023/08/26
1.5K0
Python 运用zabbix开发简易巡检工具
利用SSH或者Zabbix监控,配合Django开发框架,改造出属于自己的监控平台,实现包括主机图形,自动发现,计划任务,批量cmd执行,服务监控,日志监控等功能,由于公司机器混乱,基本上市面上的所有设备都能找到,监控这些不同型号不同系统的主机需要分别对待,我们就借助各种开源项目来做一个简单的巡检工具,方便工作需要。
王瑞MVP
2022/12/28
1.6K0
Python 运用zabbix开发简易巡检工具
Python 执行Shell 外部命令
1、os.system() 此方法执行的外部程序,会将结果直接输出到标准输出。os.system的返回结果为执行shell 的 $? 值。 因此请执行没有输出结果的程序时适合使用此方法。如touch
py3study
2020/01/07
1.3K0
python中执行DOS命令的3种方法小
现在大部分人都喜欢使用Popen。Popen方法不会打印出cmd在linux上执行的信息。的确,Popen非常强大,支持多种参数和模式。使用前需要from subprocess import Popen, PIPE。但是Popen函数有一个缺陷,就是它是一个阻塞的方法。如果运行cmd时产生的内容非常多,函数非常容易阻塞住。解决办法是不使用wait()方法,但是也不能获得执行的返回值了。
py3study
2020/01/09
2.3K0
Python 执行系统命令
Python 编程过程中经常会用到系统命令,本文记录实现方法。 系统命令 作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有以下方式 os.system() os.popen() subprocess 模块 os.system 执行命令但无法获取取命令输出时,可以使用 os.system os.system() 是C语言 system() 函数的封装,返回命令的退出状态码,命令执行结果输出到标准输出(stdout/窗口)。 system函数可以将
为为为什么
2022/08/10
1.8K0
使用 python 执行 shell 命令的几种常用方式
在使用 Python 编写自动化脚本的时候,难免会需要执行一些基本的 shell 命令,而 Python 执行 shell 命令的方式有好几种,如果根据需要选择最适合的方式显得非常重要,这篇文章就来总结和对比一下几种常见的 Python 运行 shell 命令的方式。
Hopetree
2022/09/26
3.3K0
python中执行shell命令的几个方
最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 代码如下:
py3study
2020/01/06
3.1K0
用Python写Shell脚本
os.system函数与系统编程中的exec族函数调用一致,创建出子进程后代码段由外部程序替换,不会返回外部程序运行结果。
菜菜cc
2022/11/15
1.5K0
Python模块之subprocess用法实例详解
subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。
菲宇
2019/06/13
26.7K0
Python调用Shell命令
前言:在python程序里面难免会用到shell命令,在python调用shell脚本也不是很难,记录了一下! ****通过os模块**** system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果 #os-One #只返回结果 os.system(command) sample import os print os.system("service apache2 status") ---- popen方不仅仅返回结果,还返回一个类文件对象,通过调用该对象的read()或readlines
AlicFeng
2018/06/08
1.4K0
python之系统命令
以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能。
菲宇
2019/06/13
1.1K0
相关推荐
python调用外部命令的四种方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验