Python模块——subprocess

subprocess模块

通过Python去执行一条系统命令或脚本。

三种执行命令的方法

  • subprocess.run(*popenargs, input=None, timeout=None, check=False, **kwargs) #官方推荐

  • subprocess.call(*popenargs, timeout=None, **kwargs) #跟上面实现的内容差不多,另一种写法

  • subprocess.Popen() #上面各种方法的底层封装

run方法

标准写法

subprocess.run(['df','-h'],stderr=subprocess.PIPE,stdout=subprocess.PIPE,check=True) 
#check=True代表,如果命令出现错误,程序会抛出异常

涉及到管道|的命令需要这样写

subprocess.run('df -h|grep disk1',shell=True) #shell=True的意思是这条命令直接交给系统去执行,不需要python负责解析

 

call方法

#执行命令,返回命令执行状态 , 0 or 非0
>>> retcode = subprocess.call(["ls", "-l"])#执行命令,如果命令结果为0,就正常返回,否则抛异常
>>> subprocess.check_call(["ls", "-l"])
0#接收字符串格式命令,返回元组形式,第1个元素是执行状态,第2个是命令结果 
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')#接收字符串格式命令,并返回结果
>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'#执行命令,并返回结果,注意是返回结果,不是打印,下例结果返回给res
>>> res=subprocess.check_output(['ls','-l'])
>>> res
b'total 0\ndrwxr-xr-x 12 alex staff 408 Nov 2 11:05 OldBoyCRM\n'

Popen方法

常用参数:

  • args:shell命令,可以是字符串或者序列类型(如:list,元组)
  • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
  • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
  • shell:同上
  • cwd:用于设置子进程的当前目录
  • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。

下面这2条语句执行会有什么区别?

a=subprocess.run('sleep 10',shell=True,stdout=subprocess.PIPE)
a=subprocess.Popen('sleep 10',shell=True,stdout=subprocess.PIPE)

区别是Popen会在发起命令后立刻返回,而不等命令执行结果。这样的好处是什么呢?

如果你调用的命令或脚本 需要执行10分钟,你的主程序不需卡在这里等10分钟,可以继续往下走,干别的事情,每过一会,通过一个什么方法来检测一下命令是否执行完成就好了。

Popen调用后会返回一个对象,可以通过这个对象拿到命令执行结果或状态等,该对象有以下方法

poll()Check if child process has terminated. Returns returncodewait()Wait for child process to terminate. Returns returncode attribute.terminate()终止所启动的进程Terminate the process with SIGTERMkill() 杀死所启动的进程 Kill the process with SIGKILL

send_signal(signal.xxx)发送系统信号pid 拿到所启动进程的进程号

 poll

>>> a=subprocess.Popen('sleep 10',shell=True,stdout=subprocess.PIPE)
>>> a.poll()
>>> a.poll()
>>> a.poll()
0

 termiate

>>> a = subprocess.Popen('for i in $(seq 1 100);do sleep 1;echo $i >> /tmp/sleep.log;done',shell=True, cwd='/tmp',stdout=subprocess.PIPE)
>>> a.terminate()
>>> 

 

preexec_fn

>>> def sayhi():
...     print('haha')
... 
>>> a = subprocess.Popen('sleep 5',shell=True,stdout=subprocess.PIPE,preexec_fn=sayhi)
>>> a.stdout
<_io.BufferedReader name=3>
>>> a.stdout.read()
b'haha\n'
>>> a.pid
2070

 

代码案例

import subprocess
from utils import unicode_utils
# 执行cmd或shell命令#
from multiprocessing.dummy import Pool as ThreadPooldef cmd_exec(cmd):"""执行shell命令返回命令返回值和结果:param cmd::return:"""p = subprocess.Popen(cmd,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)stdout, stderr = p.communicate()#从PIPE中读取出PIPE中的文本,放入内存if p.returncode != 0:return {'code':p.returncode, 'res':unicode_utils.to_str(stderr)}return {'code':p.returncode, 'res':unicode_utils.to_str(stdout)}if __name__ == '__main__':passcmd_list =[]cmd_list.append('df -h')cmd_list.append('ps -ef|grep jav1a|grep -v grep')cmd_list.append('ps -ef|grep "pol"')cmd_list.append('sh /root/ops/sum.sh')# print(cmd_exec(cmd))# Make the Pool of workerspool = ThreadPool(4)# Open the urls in their own threads# and return the resultsresults = pool.map(cmd_exec, cmd_list)# close the pool and wait for the work to finishprint(results)pool.close()pool.join()**************************************
unicode_utils:def to_str(bytes_or_str):"""把byte类型转换为str:param bytes_or_str::return:"""if isinstance(bytes_or_str, bytes):value = bytes_or_str.decode('utf-8')else:value = bytes_or_strreturn value

  

  

 

转载于:https://www.cnblogs.com/xiao-apple36/p/8857201.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bulter机器人_科普!九款使用率最高的物流机器人大盘点!

原标题&#xff1a;科普&#xff01;九款使用率最高的物流机器人大盘点&#xff01;说起快递的速度&#xff0c;中国可谓是跑在全球前列&#xff0c;因为强大的人力资源以及完善的供应链结构&#xff0c;导致整个运作过程很流畅快速。但是&#xff0c;如果在特殊的节点&#xf…

异步传参

2019独角兽企业重金招聘Python工程师标准>>> AJAX样板 $.ajax ({ type:"post", url:"要传递参数的地址", data:{id:id}, success:function(val) { …

PHP实现单击“添加”按钮增加一行表单项,并将所有内容插入到数据库中

PHP实现单击“添加”按钮增加一行表单项&#xff0c;并将所有内容插入到数据库中 效果图: htmljquery: <html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script language"javascript&qu…

Leetcode按Tag刷题

按照Leetcode的Tag来刷题&#xff0c;从easy到hard刷题 关于如何让Leetcode按难易程度排序&#xff0c;可按以下步骤&#xff1a; 1. 进入Leetcode后&#xff0c;点击code 2.点击code后&#xff0c;可查看所有题目&#xff0c;可看到右下角有Tag标志&#xff0c;选择想要刷的T…

JMeter学习(三十一)Access Log Sampler

前提&#xff1a; 在tomcat\conf\server.xml默认情况下&#xff0c;会有一段代码&#xff1a; <Valve className"org.apache.catalina.valves.AccessLogValve" directory"logs" pattern"%h %l %u %t &quot;%r&quot; %s %b" prefix&qu…

布谷鸟沙盒分析静态文件_“案例沙盒方法”喜提国际商学院协会(AACSB)2019年启发式创新奖...

国际商学院协会(AACSB)于2019年4月14日至16日在英国爱丁堡召开年会&#xff0c;会上公布了2019年Innovation that Inspire的(启发式创新奖)获奖学校及项目。大会共收到800余个项目报名&#xff0c;最终21个项目获此殊荣。新南威尔士大学商学院以创新品牌UNSW Sandbox Method (案…

淘宝npm镜像使用方法(转)

1.临时使用 npm --registry https://registry.npm.taobao.org install express 2.持久使用 npm config set registry https://registry.npm.taobao.org 配置后可通过下面方式来验证是否成功 npm config get registry或 npm info express3.通过cnpm使用 npm install -g cnpm --r…

Console.Write(程序猿?开发?写代码?编程?移动、网页、桌面开发?Oh,我连菜鸟都不是!);...

You make choices and dont look back. 虽然不是学计算机出身&#xff0c;但我对于写代码充满了好奇&#xff0c;尽管这种兴趣还不像烈酒那样浓烈&#xff0c;也不能像打鸡血似的刺激自己每个神经元而浑身激情&#xff0c;而熊猫眼的熬夜。但现在也一如既往的坚持&#xff0c;坚…

基本动态规划问题

小东所在公司要发年终奖&#xff0c;而小东恰好获得了最高福利&#xff0c;他要在公司年会上参与一个抽奖游戏&#xff0c;游戏在一个6 * 6的棋盘上进行&#xff0c;上面放着36个价值不等的礼物&#xff0c;每个小的棋盘上面放置着一个礼物&#xff0c;他需要从左上角开始游戏&…

还有前景吗_喷码机行业还有前景吗 2021喷码机市场份额有多大

喷码机按照其实现的方式不同又分为&#xff0c;压电喷墨技术、压阀式喷墨技术、和热发泡喷墨技术(Thermal Inkjet Technolog)&#xff0c;简称TIJ。根据以上原理可以将喷码机分为&#xff1a;小字符喷码机&#xff0c;大字符喷码机&#xff0c;高清晰喷码机。喷码机是运用带电的…

scrapy之内蒙古自治区环境保护厅

主程序&#xff1a; # -*- coding: utf-8 -*- import re, scrapy from urllib.parse import urljoin from nmgepb.items import NmgepbItemclass BasicNmgepbSpider(scrapy.Spider):name basic_nmgepballowed_domains [nmgepb.gov.cn]start_urls [http://nmgepb.gov.cn/]def…

supervisor 守护多个进程_进程管理工具之Supervisor

相关介绍Supervisor是用Python 开发的一个client/server服务&#xff0c;是 Linux /Unix系统下的一个进程管理工具&#xff0c;不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程&#xff0c;当一个进程意外被杀死&#xff0c;s…

MySQL运算符优先级顺序

待续。。。转载于:https://www.cnblogs.com/yuyue2014/p/4451035.html

yaahp层次分析法步骤_综合评价方法之层次分析法,选择再也难不倒你!

在日常生活中&#xff0c;我们常常面临着各种各样的选择。比如你想去北京、上海、广州旅游&#xff0c;但是由于种种原因&#xff0c;你只能选择一个地点去旅游&#xff0c;那么哪一种选择是最优的呢&#xff1f;有没有较为科学的方法帮助我们更好地选择呢&#xff1f;今天&…

TCP/IP TELNET SSH

快速导航 远程登录示例 关于远程登录&#xff1f; 嵌入&#xff1f; 用来控制远程服务器上运行的应用程序字符&#xff1f; 转义&#xff1f; 操作方式&#xff1f; 关于SSH&#xff1f; 远程登录示例 关于远程登录&#xff1f; 网络虚拟终端(Network Virtual Terminal,NVT)通过…

CentOs中iptables配置允许mysql远程访问

在CentOS系统中防火墙默认是阻止3306端口的&#xff0c;我们要是想访问mysql数据库&#xff0c;我们需要这个端口&#xff0c;命令如下&#xff1a; 1 /sbin/iptables -I INPUT -p tcp --dport 3036 -j ACCEPT 我们需要保存我们的操作&#xff0c;命令如下&#xff1a; 1 /etc…

莫兰迪紫rgb_莫兰迪rgb参数_译述北京 | RGB的前世今生

译述北京 | RGB的前世今生作为服饰三大要素之一的颜色 也常是女孩们着眼关注的话题不论是和谐统一还是创意满分的色彩搭配总是能让平平无奇的衣服具有吸引力 让人耳目一新从“泫雅风”的五彩斑斓到莫兰迪色系的低饱和度以及和bm风相辅相成的田园小清新色色彩在女孩们的《时尚经…

java 解决时间相减问题

比如 Date currentTime "2011-06-20 9:23:50"; Date endTime"2011-06-21 10:33:56"; 要求的结果是 endTime - currentTime 还剩余1天1小时10分6秒&#xff1b;如何来实现这个功能&#xff1f;&#xff1f; import java.text.SimpleDateFormat; import jav…

如何用 Python 实现 Web 抓取?

【编者按】本文作者为 Blog Bowl 联合创始人 Shaumik Daityari&#xff0c;主要介绍 Web 抓取技术的基本实现原理和方法。文章系国内 ITOM 管理平台 OneAPM 编译呈现&#xff0c;以下为正文。 随着电子商务的蓬勃发展&#xff0c;笔者近年越来越着迷于比价应用。我在网络上&…

sentinel 不显示项目_Sentinel+Nacos实现资源流控、降级、热点、授权

本文同名博客老炮说Java&#xff1a;https://www.laopaojava.com/&#xff0c;每天更新Spring/SpringMvc/SpringBoot/实战项目等文章资料SentinelNacos 是微服务环境搭建必不可少的两个组件&#xff0c;这里给大家推荐一套微服务教程&#xff1a;SpringCloud微服务电商项目教程…