一、

subprocess.getstatusoutput
import subprocess
cmd = 'ifconfig'
def cmds(cmd,print_msg=True):
status,result = subprocess.getstatusoutput(cmd)
if status > 0:
return {"status":"failed","msg":result}
return {"status":"succeed","msg":result}

  可以将执行之后的状态和执行结果反馈,但是痛点:result是一次性返回,简单的说就是,比如你执行一条ping www.baidu.com的命令,程序一直是在执行状态,无任何输出,只当执行结束后返回status和result

二、

subprocess.Popen
import subprocess
cmd = 'ping www.baidu.com'
def cmds(cmd,print_msg=True):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print(p.stderr)
lines = []
for line in iter(p.stdout.readline, b''):
line = line.rstrip().decode('utf8')
if print_msg:
print(">>>", line)
if __name__ == '__main__': cmds(cmd)

  成功解决之前的问题,可将命令的执行结果实时更新,但是在执行结束之后并不能得知其执行状态是成功或失败

def cmds(self,cmds, print_msg=True):
compilePopen = subprocess.Popen(cmds,shell=True,stdout=subprocess.PIPE,close_fds=True,stderr=subprocess.STDOUT)
compilePopen.wait() # 没有这个无法得知compilePopen.returncode状态是否成功
for line in iter(compilePopen.stdout.readline, b''):
msg = line.rstrip().decode('utf8')if print_msg:
self.ws.send(json.dumps({
"progress": "run_script",
"msg": msg,
'ctime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
'user': self.task.username
}))
# if compilePopen.returncode >= 0: # 执行成功
     
# else: # 执行失败

重新调整了之后可以将实时内容和执行状态都做拿到,但是亲测感觉效率并不好,还有没有更好的办法呢?


或者
def sh(self,cmds, print_msg=True):
print('sh')
msgStr = []
env = Business_Env_Assets.objects.filter(id=self.apps.env).first().name
compilePopen = subprocess.Popen(cmds,shell=True,stdout=subprocess.PIPE,close_fds=True,stderr=subprocess.STDOUT)
returnMsg = ''
for line in iter(compilePopen.stdout.readline, b''):
line = line.rstrip().decode('utf8')
print(line)
stdout, stderr = compilePopen.communicate()
returncode = compilePopen.returncode
if returncode > 0:
result = {"status": "failed", "msg": returnMsg}
result = {"status": "succeed", "msg": returnMsg}
self.handle_result("post_deploy", result)
												

python--终端工具之subprocess的更多相关文章

  1. 12款最佳Linux命令行终端工具, 20款优秀的 Linux 终端仿真器

    12款最佳Linux命令行终端工具     如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的 ...

  2. Python标准库---子进程 (subprocess包)

    这里的内容以Linux进程基础和Linux文本流为基础.subprocess包主要功能是执行外部的命令和程序.比如说,我需要使用wget下载文件.我在Python中调用wget程序.从这个意义上来说, ...

  3. 下破解安装Python开发工具WingIDE4.1

    步骤: 1.将系统时间调整到一个月之前,然后执行安装. 可以使用date命令调整系统时间,如:date -s '2012-08-14 10:00:00' 2.安装成功后,打开程序,按照提示信息,申请一 ...

  4. Lubuntu下小巧好用的Python编辑工具Geany

    在Lubuntu系统上有很多的Python编辑器,如eclipse,PyCharm等,功能繁多,市场占有率高,但动辄几百M的体积有些巨大,博主今天推荐一款精简且易用的Python开发工具--Geany ...

  5. Python生态工具、文本处理和系统管理(虚拟)

    一.Python生态工具 一.Python内置小工具 1.秒级启动一个下载服务器 Python 内置了一个下载服务器就能够显著提升效率了 . 例如, 你的同事要让你传的文件位于某一个目录下,那么,你可 ...

  6. Mac OS X 命令行用户应当知道的八个终端工具

    原文链接:Eight Terminal Utilities Every OS X Command Line User Should Know OS X  的Terminal 终端开辟了强大的UNIX实 ...

  7. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

  8. Python开发工具PyCharm个性化设置(图解)

    Python开发工具PyCharm个性化设置,包括设置默认PyCharm解析器.设置缩进符为制表符.设置IDE皮肤主题等,大家参考使用吧. JetBrains PyCharm Pro 4.5.3 中文 ...

  9. [转]12款最佳Linux命令行终端工具

    摘要 “工欲善其事必先利其器”,作为菜鸟,也是从别人那里偷学来的一些东东.今天看到同事用到一个终端命令行工具,觉得自己弱爆了.然后在网上搜了下该工具.发现类似的工具还是挺多的,只是自己不知道罢了. 原 ...

  10. Python小工具--删除svn文件

    有的时候我们需要删除项目下的svn相关文件,但是SVN会在所有的目录下都创建隐藏文件.svn,手工一个个目录查找然后删除显然比较麻烦.所以这里提供了一个Python小工具用于批量删除svn的相关文件: ...

随机推荐

  1. golang学习笔记(一):包,变量,函数

    欢迎访问我的博客和github! go 语言学习笔记第一弹,来自 gotour ,以后要常写笔记,把自己学习笔记记录下来,就算只是笔记也要多写. 好记性不如烂笔头,也要多锻炼自己的写作能力. 说实话, ...

  2. num13---外观模式/过程模式

    假设家庭影院有一系列设备,每个设备都有各种开闭等功能性方法,使用家庭影院功能的时候,需要进行各个设备的一系列操作,繁琐麻烦. 现在提供一个外观类,在里面定义操作流程,客户端只需要和外观类进行接口交互即 ...

  3. Linux 查看磁盘容量、查找大文件、查找大目录

    Linux 查看磁盘容量.查找大文件.查找大目录 磁盘统计 查看磁盘使用情况 df -h 文件统计 查找/home 目录下大于800M的文件 find /home -type f -size +800 ...

  4. javascript检测客户端环境是否是pc端

    //isPC(): 检测客户端环境是否是pc端 function isPC(){ let userAgent = navigator.userAgent; let agents = ["An ...

  5. VFP检测SQL Server的五个实例代码

    ** 需要指出的是,无论下面哪种方式的代码,都需要打开本机的网络共享,否则找不到SQL服务器** 例一 ************************************************ ...

  6. pytorch之 batch_train

    import torch import torch.utils.data as Data torch.manual_seed(1) # reproducible BATCH_SIZE = 5 # BA ...

  7. Linux 报错:syntax error "C" 解决办法(此处选择bash系统)

    出现此问题的原因,是由系统的兼容性引起的,linux下默认了指向dash而非bash. linux下Dash改Bash: 1.先查看是使用哪个shell ls -al /bin/sh 2.#如果是Da ...

  8. C#中实现文件拖放打开的方法

    C#中实现文件拖放打开的方法 设置Form属性 AllowDrop = True; 在Form事件中 private void Form1_DragDrop(object sender, DragEv ...

  9. Centos7 使用Docker 部署mssql 2017

    mssql是.NET的标配,一般使用.NET的人基本都用mssql. 以前mssql只能支持windows平台,从微软打出 拥抱开源 的口号开始,mssql的2017 版本,开始支持linux系统. ...

  10. 万科A顺利出局,布局一心堂

    万科的这两日的走势还不错,今日冲高回落,顺利出局. 那么有选中了一只 股票    一心堂 资金量W    12 建仓价格    22.2 加仓系数    1.5 加仓间隔    1.50% 总盈利比  ...