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
Python模块——subprocess相关推荐
- Python基础篇【第6篇】: Python模块subprocess
Python中可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen* --废弃 popen2.* --废弃 com ...
- python模块--subprocess
subprocess模块 ...
- Python模块subprocess小记
在熟悉了Qt的QProcess以后,再回头来看python的subprocess总算不觉得像以前那么恐怖了. 和QProcess一样,subprocess的目标是启动一个新的进程并与之进行通讯. su ...
- python模块subprocess学习
subprocess模块介绍 subprocess是python创建子进程的工具,其实和c中的fork出一个子进程,然后在子进程中运行exec执行另外一个进程很类似. subprocess包中有很多方 ...
- python子进程模块subprocess
2019独角兽企业重金招聘Python工程师标准>>> python子进程模块subprocess 目录 一.subprocess 模块简介 1.1. 使用 subprocess模块 ...
- python打印字节流_Python 调用系统命令的模块 Subprocess
有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块提供了多个方法来运行额外的进程.在 Python2.7 ...
- Python之subprocess模块
subprocess模块允许你启动一个新的进程,连接输入/输出/错误的管道, 获得子进程的返回码.这个模块目标是代替一些老的模块,比如os.system和os.spawn. 0x01 常见subpr ...
- Python的subprocess模块(一)
原文连接:http://www.cnblogs.com/wang-yc/p/5624880.html 一.简介 subprocess最早在2.4版本引入.用来生成子进程,并可以通过管道连接他们的输入/ ...
- 【Python】python之subprocess模块详解
[Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...
最新文章
- mysql数据库建表失败_mysql数据库文件太大导致建表失败,如何避免
- Cocoa pods的安装
- yolo-mask的损失函数l包含三部分_【AI初识境】深度学习中常用的损失函数有哪些?...
- 内存中的rank跟bank有什么区别
- MySQL的优化与执行
- imf瞬时频率跳变问题
- 万字长文|深入理解XDP全景指南
- 内建控制结构之if表达式
- C#8.0宝藏好物Async streams
- 【渝粤题库】陕西师范大学200681C语言程序设计 作业(高起专、高起本)
- SQL Server 文件规划 -位置规划
- 软件测试bug文档模板,国家标准测试计划文档模板
- MFC用PostMessage传递消息
- greedy算法/算法导论/挑战程序设计竞赛
- matlab fts2mat,机器学习——使用Matlab工具箱
- boobooke大牛小牛们的视频教程
- Python 入门 第一到第三天
- 程序员如何写简历之简介篇(一)
- 电影院订票选座小程序,电影购票小程序,微信小程序电影院订票系统毕设作品
- 【微服务】Nacos 注册中心的设计原理