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相关推荐

  1. Python基础篇【第6篇】: Python模块subprocess

    Python中可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 com ...

  2. python模块--subprocess

    subprocess模块                                                                                         ...

  3. Python模块subprocess小记

    在熟悉了Qt的QProcess以后,再回头来看python的subprocess总算不觉得像以前那么恐怖了. 和QProcess一样,subprocess的目标是启动一个新的进程并与之进行通讯. su ...

  4. python模块subprocess学习

    subprocess模块介绍 subprocess是python创建子进程的工具,其实和c中的fork出一个子进程,然后在子进程中运行exec执行另外一个进程很类似. subprocess包中有很多方 ...

  5. python子进程模块subprocess

    2019独角兽企业重金招聘Python工程师标准>>> python子进程模块subprocess 目录 一.subprocess 模块简介 1.1. 使用 subprocess模块 ...

  6. python打印字节流_Python 调用系统命令的模块 Subprocess

    有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块提供了多个方法来运行额外的进程.在 Python2.7 ...

  7. Python之subprocess模块

    subprocess模块允许你启动一个新的进程,连接输入/输出/错误的管道,  获得子进程的返回码.这个模块目标是代替一些老的模块,比如os.system和os.spawn. 0x01 常见subpr ...

  8. Python的subprocess模块(一)

    原文连接:http://www.cnblogs.com/wang-yc/p/5624880.html 一.简介 subprocess最早在2.4版本引入.用来生成子进程,并可以通过管道连接他们的输入/ ...

  9. 【Python】python之subprocess模块详解

    [Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...

最新文章

  1. mysql数据库建表失败_mysql数据库文件太大导致建表失败,如何避免
  2. Cocoa pods的安装
  3. yolo-mask的损失函数l包含三部分_【AI初识境】深度学习中常用的损失函数有哪些?...
  4. 内存中的rank跟bank有什么区别
  5. MySQL的优化与执行
  6. imf瞬时频率跳变问题
  7. 万字长文|深入理解XDP全景指南
  8. 内建控制结构之if表达式
  9. C#8.0宝藏好物Async streams
  10. 【渝粤题库】陕西师范大学200681C语言程序设计 作业(高起专、高起本)
  11. SQL Server 文件规划 -位置规划
  12. 软件测试bug文档模板,国家标准测试计划文档模板
  13. MFC用PostMessage传递消息
  14. greedy算法/算法导论/挑战程序设计竞赛
  15. matlab fts2mat,机器学习——使用Matlab工具箱
  16. boobooke大牛小牛们的视频教程
  17. Python 入门 第一到第三天
  18. 程序员如何写简历之简介篇(一)
  19. 电影院订票选座小程序,电影购票小程序,微信小程序电影院订票系统毕设作品
  20. 【微服务】Nacos 注册中心的设计原理

热门文章

  1. Android商城开发系列(二)——App启动欢迎页面制作
  2. 剑指Offer_52_正则表达式匹配
  3. 以后可能用到的一些OQL
  4. OllyDBG 入门之四--破解常用断点设
  5. RUNOOB python练习题9 如何在代码中加入砸瓦鲁多
  6. redis终端简单命令
  7. PKI系统相关知识点介绍
  8. IE 弹出框处理经验
  9. java开发过程中的命名规范
  10. [見好就收]NET 2.0 - WinForm Control - DataGridView 编程36计